gpt4 book ai didi

c# - 如何在内存中构建一个 ZipArchive 并通过 Web API 2 中的 IHttpActionResult 下载?

转载 作者:行者123 更新时间:2023-11-30 23:24:12 25 4
gpt4 key购买 nike

我有一个具有以下 GET 方法的 Web API 2 ApiController:

[HttpGet]
public IHttpActionResult GetZip()
{
return new ZipFileActionResult();
}

我对 IHttpActionResult 的自定义实现

public class ZipFileActionResult : IHttpActionResult
{
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var memoryStream = new MemoryStream();
var response = new HttpResponseMessage(HttpStatusCode.OK);

using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
var entry = archive.CreateEntry("MyFileName.txt");

using (var streamWriter = new StreamWriter(entry.Open()))
{
streamWriter.Write("It was the best of times, it was the worst of times...");
}

}

response.Content = new StreamContent(memoryStream);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "example.zip"
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
return Task.FromResult(response);
}
}

当我使用 Postman 获取时,我得到“无响应”。创建 StreamContent 的断点显示流的长度约为 1000 字节。我错过了什么?

其他类似但不重复的问题

这个问题不是重复的,虽然它似乎有一些 sibling :

最佳答案

您必须将 memoryStream 位置重置为“0”,这样它在写入响应时就不会尝试从文件末尾开始。固定代码应如下所示:

using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
var entry = archive.CreateEntry("MyFileName.txt");

using (var streamWriter = new StreamWriter(entry.Open()))
{
streamWriter.Write("It was the best of times, it was the worst of times...");
}
}

//ADD THIS LINE
memoryStream.Position = 0;

response.Content = new StreamContent(memoryStream);

关于c# - 如何在内存中构建一个 ZipArchive 并通过 Web API 2 中的 IHttpActionResult 下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37949087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com