从URLS创建.net Core中的zip而无需在服务器上下载

use*_*804 8 .net c# zip

我有互联网URL列表我试图使用Memorystream创建一个zip.文件在s3桶上,但s3 sdk没有任何功能可以下载文件夹作为zip.

避免将其保存在服务器上并删除它们.该项目在Ubuntu上运行.我试过得到如下响应,

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("MyClient", "1.0"));
var result = await httpClient.GetStreamAsync(names[0]);
Run Code Online (Sandbox Code Playgroud)

但是.NET中的ZipArchive类采用本地文件路径而不是内存流

注意:我不能使用SharpZipLib,因为.NET Core不支持它.

Dai*_*Dai 16

但是.NET中的ZipArchive类采用本地文件路径而不是内存流

这是不真实的,ZipArchive该类具有接受Stream实例的重载:

https://msdn.microsoft.com/en-us/library/hh158268(v=vs.110).aspx

从指定的流初始化ZipArchive类的新实例.

public ZipArchive(Stream stream)
Run Code Online (Sandbox Code Playgroud)

(文档适用于完整的.NET Framework,但.NET Core实现具有相同的界面:https://github.com/dotnet/corefx/blob/master/src/System.IO.Compression/src/System/IO /Compression/ZipArchive.cs)

像这样:

class ItemToAdd {
    public String Name;
    public Stream Content;
}

List<ItemToAdd> itemsToAdd = GetItemsFromAmazonS3();

using( MemoryStream zipStream = new MemoryStream() ) {

    using( ZipArchive zip = new ZipArchive( zipStream ) ) {

        foreach( ItemToAdd item in itemsToAdd ) {

            ZipArchiveEntry entry = zip.CreateEntry( item.Name );
            using( Stream entryStream = entry.Open() ) {

                item.Content.CopyTo( entryStream );
            }
        }

    }

    zipStream.Position = 0;

    // copy zipStream to output, or return it directly depending on your web framework
}
Run Code Online (Sandbox Code Playgroud)

  • 使用“new ZipArchive()”创建 ZipArchive 时出现错误。您需要指定模式,例如“new new ZipArchive(zipStream, ZipArchiveMode.Create)”。见 /sf/ask/2358119781/ (2认同)
  • @MeanGreen 我已经更新了我的答案 - 抱歉让我等了 3 年! (2认同)