一些背景知识,我实现了一个流式 ZipArchive 流,以允许用户同时下载大量文件。 使用 Http OutputStream 写入 ZipArchive
显然,我在下载开始时不知道 zip 文件的大小,因此我无法设置内容长度。等待 zip 文件生成不是一种选择,因为 ZipArchive 生成可能需要长达几分钟的时间(文件数量相当大)。
但是,我仍然想通知用户某种粗略的进度(例如,他们收到的文件数量,或内容长度的粗略估计)。是否有任何现有/即将推出的协议:
Content-Length
类型标头(浏览器仅用作参考而不是确切的长度)。chunked
传输协议,指定块的数量。我有一个视图,它返回一个包含多个页面的pdf(使用iTextSharp),但现在我必须更改它,以便每个页面都是一个单独的pdf(带有它自己的唯一标题)并返回一个zip文件.
我的原始代码如下所示:
public FileStreamResult DownloadPDF()
{
MemoryStream workStream = new MemoryStream();
Document document = new Document();
PdfWriter.GetInstance(document, workStream).CloseStream = false;
document.Open();
// Populate pdf items
document.Close();
byte[] byteInfo = workStream.ToArray();
workStream.Write(byteInfo, 0, byteInfo.Length);
workStream.Position = 0;
FileStreamResult fileResult = new FileStreamResult(workStream, "application/pdf");
fileResult.FileDownloadName = "fileName";
return fileResult;
}
Run Code Online (Sandbox Code Playgroud)
使用gzip压缩文件看起来很简单,但我不知道如何gzip多个文件并将其作为一个zip文件返回.或者我应该使用gzip以外的东西,比如dotnetzip或sharpzip?
提前致谢!
我想调用一个 Web api 方法并让它允许用户下载我在内存中创建的 zip 文件。我也想在内存中创建条目。
我无法让服务器正确输出下载。
这是我的网络 API 方法:
[HttpGet]
[Route("api/downloadstaffdata")]
public HttpResponseMessage DownloadStaffData()
{
var response = new HttpResponseMessage(HttpStatusCode.OK);
using (var stream = new MemoryStream())
{
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
{
//future for loop to create entries in memory from staff list
var entry = archive.CreateEntry("bob.txt");
using (var writer = new StreamWriter(entry.Open()))
{
writer.WriteLine("Info for: Bob");
}
//future add staff images as well
}
stream.Seek(0, SeekOrigin.Begin);
response.Content = new StreamContent(stream);
}
response.Content.Headers.ContentDisposition = new …
Run Code Online (Sandbox Code Playgroud)