gpt4 book ai didi

c# - 即时创建一堆 URL 的动态 zip

转载 作者:太空狗 更新时间:2023-10-29 23:51:22 26 4
gpt4 key购买 nike

我正在尝试即时创建任意大小的 zip 文件。 zip 存档的来源是一堆 URL,可能很大(列表中有 500 个 4MB JPG)。我希望能够在请求中执行所有操作并立即开始下载并创建 zip 并在构建时进行流式传输。它不必驻留在内存中或服务器的磁盘上。

我最接近的是:注意:urls 是文件名 URL 的键值对,因为它们应该存在于创建的 zip 中

Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/zip";
Response.AddHeader("Content-Disposition", "attachment; filename=DyanmicZipFile.zip");

using (var memoryStream = new MemoryStream())
{
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
foreach (KeyValuePair<string, string> fileNamePair in urls)
{
var zipEntry = archive.CreateEntry(fileNamePair.Key);

using (var entryStream = zipEntry.Open())
using (WebClient wc = new WebClient())
wc.OpenRead(GetUrlForEntryName(fileNamePair.Key)).CopyTo(entryStream);

//this doesn't work either
//using (var streamWriter = new StreamWriter(entryStream))
// using (WebClient wc = new WebClient())
// streamWriter.Write(wc.OpenRead(GetUrlForEntryName(fileNamePair.Key)));
}
}

memoryStream.WriteTo(Response.OutputStream);
}
HttpContext.Current.ApplicationInstance.CompleteRequest();

此代码为我提供了一个 zip 文件,但 zip 中的每个 JPG 文件只是一个文本文件,上面写着“System.Net.ConnectStream”我对此进行了其他尝试,它们确实构建了一个包含适当文件的 zip 文件,但是您可以从开始时的延迟看出服务器完全在内存中构建 zip,然后在最后将其删除。当文件数接近 50 时,它根本没有响应。评论中的部分给了我同样的结果,我也尝试过 Ionic.Zip。

这是 IIS8 上的 .NET 4.5。我正在使用 VS2013 构建并尝试在 AWS Elastic Beanstalk 上运行它。

最佳答案

所以回答我自己的问题 - 这是适合我的解决方案:

private void ProcessWithSharpZipLib()
{
byte[] buffer = new byte[4096];

ICSharpCode.SharpZipLib.Zip.ZipOutputStream zipOutputStream = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(Response.OutputStream);
zipOutputStream.SetLevel(0); //0-9, 9 being the highest level of compression
zipOutputStream.UseZip64 = ICSharpCode.SharpZipLib.Zip.UseZip64.Off;

foreach (KeyValuePair<string, string> fileNamePair in urls)
{
using (WebClient wc = new WebClient())
{
using (Stream wcStream = wc.OpenRead(GetUrlForEntryName(fileNamePair.Key)))
{
ICSharpCode.SharpZipLib.Zip.ZipEntry entry = new ICSharpCode.SharpZipLib.Zip.ZipEntry(ICSharpCode.SharpZipLib.Zip.ZipEntry.CleanName(fileNamePair.Key));

zipOutputStream.PutNextEntry(entry);

int count = wcStream.Read(buffer, 0, buffer.Length);
while (count > 0)
{
zipOutputStream.Write(buffer, 0, count);
count = wcStream.Read(buffer, 0, buffer.Length);
if (!Response.IsClientConnected)
{
break;
}
Response.Flush();
}
}
}
}
zipOutputStream.Close();

Response.Flush();
Response.End();
}

关于c# - 即时创建一堆 URL 的动态 zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292795/

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