我在ASP .Net MVC(dotnet core 2.1(中有一个控制器,我正在尝试向用户返回一个zip文件。
[HttpGet]
public async Task<ActionResult> GetLogFiles([FromQuery] string date,
[FromQuery] string startTime,
[FromQuery] string endTime)
{
var decryptedFiles = new Dictionary<string, string>();
// Code to get log files, decrypt them and add to dictionary
using (var memoryStream = new MemoryStream())
{
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
foreach (var (name, data) in decryptedFiles)
{
_logger.LogInformation($"Adding {name}");
var entry = archive.CreateEntry(name);
using (var entryStream = entry.Open())
{
using (var writer = new StreamWriter(entryStream, Encoding.GetEncoding("Windows-1252")))
{
writer.Write(data);
}
}
}
}
memoryStream.Seek(0, SeekOrigin.Begin);
var rawData = memoryStream.ReadAll();
var response = File(rawData, "application/zip", "logs.zip");
return response;
}
}
public static byte[] ReadAll(this Stream stream)
{
var count = (int) stream.Length;
var buffer = new byte[count];
var offset = 0;
while (offset < count)
{
var read = stream.Read(buffer, offset, count - offset);
if (read == 0)
{
throw new EndOfStreamException();
}
offset += read;
}
return buffer;
}
当我在Chrome中访问URI时,它似乎下载了zip文件,但是,当我尝试打开它时,Windows声称该文件无效。
如果我在 Fiddler 中发出请求,我可以看到服务器返回了一个 base 64 的 blob。如果我手动解码这个 base 64 并保存生成的字节,它会产生一个有效的 zip 文件。
以下是所有响应标头(由于原因,有些已编辑(。
HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Length: 508
Connection: keep-alive
Date: Tue, 17 Sep 2019 14:04:43 GMT
x-amzn-RequestId: [REDACTED]
Content-Disposition: attachment; filename=logs.zip; filename*=UTF-8''logs.zip
Strict-Transport-Security: max-age=2592000
x-amzn-Remapped-Content-Length: 381
x-amz-apigw-id: [REDACTED]
X-Amzn-Trace-Id: [REDACTED]
X-Cache: Miss from cloudfront
Via: 1.1 [REDACTED]
X-Amz-Cf-Pop: [REDACTED]
X-Amz-Cf-Id: [REDACTED]
谁能建议我可能做错了什么?
任何建议非常感谢。
谢谢
史蒂夫。
因此,由于用户mjwills发布了此链接,似乎是API Gateway对二进制媒体类型的处理。
下一个障碍是我使用的是无服务器,因此无法在CloudFormation中设置它。
它在serverless.yml中的配置方式如下:
provider:
apiGateway:
binaryMediaTypes:
- "application/zip"
还是没有完全到位。难题的最后一部分是向请求添加标头。
Accept: application/zip