解决 压缩文件下载仅在部署到服务器后损坏

马达克斯

成员
已加入
2020年8月15日
留言内容
13
编程经验
5-10
早晨,

我有一个非常有趣的情况,当我使用IIS Express在本地运行我的代码时,可以很好地下载zip文件。在发布到AWS Lambda之后,该zip文件会下载但已损坏。我正在尝试了解控制器返回内存流的方式还是AWS问题。我已向AWS提交了故障单,任何人都可以看到我的控制器出现问题,从而导致此问题。

我尝试过的事情

  1. 结果.Seek(0,SeekOrigin.Begin);
  2. 结果.Position = 0;
  3. "application/zip"
  4. byte [] test = result.ToArray();然后返回数组

附言:我知道我会因为我的编码风格而c废……..大声笑....


C#:
        [HttpPost("v1/GetReaJetXMLZips")]
        public IActionResult GetReaJetXMLZips([FromBody] IEnumerable<JsonRequestModel> JsonRequestModels)
        {
            try
            {
                string FileName = string.Concat("ReaJet_", DateTime.Now.ToString("yyyyMMddhhmmss"), ".zip");
                MemoryStream result = this._IReaJetPOCImpl.GetReaJetXMLZips(JsonRequestModels);
                return File(result, "application/octet-stream", FileName);
            }
            catch(Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }
 

附件

  • ReaJet_20200817091447_GOOD.zip
    13.9 KB · Views: 7
  • ReaJet_20200817071410_BAD.zip
    18.7 KB · Views: 7
Last edited:

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,050
地点
挪威
编程经验
10+
不好的是base64编码的字符串,如果将其转换并保存字节,则它是有效的zip文件。 (Convert.FromBase64String)
我不确定,但也许尝试使用MIME类型"application/zip"? MimeMapping.GetMimeMapping实际上返回"应用程序/ x-zip压缩"zip扩展名,所以也许更好。
 

马达克斯

成员
已加入
2020年8月15日
留言内容
13
编程经验
5-10
不好的是base64编码的字符串,如果将其转换并保存字节,则它是有效的zip文件。 (Convert.FromBase64String)
我不确定,但也许尝试使用MIME类型"application/zip"? MimeMapping.GetMimeMapping实际上返回"应用程序/ x-zip压缩"zip扩展名,所以也许更好。

可能需要一点帮助...我尝试了这个,但是服务器抛出了500


C#:
        [HttpPost("v1/GetReaJetXMLZips")]
        public IActionResult GetReaJetXMLZips([FromBody] IEnumerable<JsonRequestModel> JsonRequestModels)
        {
            try
            {
                string FileName = string.Concat("ReaJet_", DateTime.Now.ToString("yyyyMMddhhmmss"), ".zip");
                MemoryStream result = this._IReaJetPOCImpl.GetReaJetXMLZips(JsonRequestModels);
                byte[] filebytes = new byte[result.Length];
                result.Read(filebytes, 0, Convert.ToInt32(result.Length));
                string test= Convert.ToBase64String(filebytes);

                return File(test, "application/zip", FileName);
            }
            catch(Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }
 

马达克斯

成员
已加入
2020年8月15日
留言内容
13
编程经验
5-10
因此,通过玩转,我能够在本地计算机上复制一个64位编码的zip,看起来像坏的zipfile一样,试图打开时出现相同的问题。我已经尝试过几次转换为32bit编码的zip,但是我真的卡住了任何帮助,这对我来说是个巨大的尝试,这也是我的最新尝试,同样会导致不好的结果

或也许我显然不明白


C#:
        [HttpPost("v1/GetReaJetXMLZips")]
        public IActionResult GetReaJetXMLZips([FromBody] IEnumerable<JsonRequestModel> JsonRequestModels)
        {
            try
            {
                string FileName = string.Concat("ReaJet_", DateTime.Now.ToString("yyyyMMddhhmmss"), ".zip");
                MemoryStream result = this._IReaJetPOCImpl.GetReaJetXMLZips(JsonRequestModels);

                byte[] byteArray = result.ToArray();
                string encodedText = Convert.ToBase64String(byteArray);
                byte[] bytes = Convert.FromBase64String(encodedText);

                MemoryStream result2 = new MemoryStream();
                result2.Write(bytes, 0, bytes.Length);
                result2.Seek(0, SeekOrigin.Begin);

                return File(result2, "application/octet-stream", FileName);
            }
            catch(Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,050
地点
挪威
编程经验
10+
我了解您在文章1中使用的方法返回了正确的字节,但是调用方将其作为base64编码的字符串接收到。我不熟悉所发布的代码,对此无能为力,我只知道您所发布的附件是什么。 Base64在Web环境中很常见,用于传输字节内容,但是我不知道如何以及在哪种环境中使用代码。
 

马达克斯

成员
已加入
2020年8月15日
留言内容
13
编程经验
5-10
我们刚刚发现,Amazon端的APIGateway会自动编码为base64,因此,无论您在Lambda端执行什么操作,都必须在客户端应用程序上接收流并进行解码,我们只是证明了这一点通过创建一个小应用程序。我正在用亚马逊记录机票,以查看是否有解决方法。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,535
地点
弗吉尼亚州切萨皮克
编程经验
10+
我的理解是,不仅必须告诉AWS API Gateway您正在返回二进制数据,而且数据的请求者还需要指出它可以接受二进制数据:


因此,这已经从C#开始,但是HTTP请求是什么样的?是AJAX电话吗?在该AJAX调用中传递了哪些标头?
 
最佳 底部