簡體   English   中英

從 URLS 在 .net Core 中創建 zip,無需在服務器上下載

[英]Create zip in .net Core from URLS without downloading on server

我有我正在嘗試使用 Memorystream 創建 zip 的 Internet URL 列表。 文件位於 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]);

但是 .NET 中的 ZipArchive 類采用本地文件路徑而不是內存流

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

但是 .NET 中的 ZipArchive 類采用本地文件路徑而不是內存流

這是不正確的, ZipArchive類具有接受Stream實例的重載:

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

從指定的流初始化 ZipArchive 類的新實例。

 public ZipArchive(Stream stream)

(文檔適用於完整的 .NET Framework,但 .NET Core 實現具有相同的接口: https : //github.com/dotnet/corefx/blob/master/src/System.IO.Compression/src/System/IO /壓縮/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, ZipArchiveMode.Create ) ) {
    
        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
}

這就是 xml Doc 可以壓縮並上傳到 aws S3 的方式,希望會對某人有所幫助。

var stMarged = new System.IO.MemoryStream();
Doc.Save(stMarged);


stMarged.Position = 0;
using (MemoryStream zipStream = new MemoryStream())
{
    using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
    {
        ZipArchiveEntry entry = zip.CreateEntry("propertyFeed.xml");

        using (Stream entryStream = entry.Open())
        {
            stMarged.CopyTo(entryStream);
        }

        //Not the best way but the file is smaler 
        //ZipArchiveEntry entry1 = zip.CreateEntry("propertyFeed1.xml");
        //using (StreamWriter writer = new StreamWriter(entry1.Open()))
        //    writer.Write(Doc2.OuterXml);
    }

    zipStream.Position = 0;
    aa += UploadZipStreamToS3(zipStream);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM