2017-04-07 51 views
3

我有互聯網URLS我試圖創建一個使用的MemoryStream拉鍊的列表創建從URL中對.NET核心拉鍊。這些文件在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類需要本地文件路徑,而不是MemoryStream的

注:我不能用SharpZipLib,因爲它不是由.NET的核心支持。

回答

4

然而在.NET中的ZipArchive類需要本地文件路徑,而不是MemoryStream的

這是不真實的,該ZipArchive類有接受Stream實例重載:

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

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

public ZipArchive(Stream stream) 

(文檔是完整的.NET框架,但.NET核心實現具有相同的接口: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 
} 
+0

不知道這是否改變了答案,但你的文檔的鏈接是完整的.NET框架不會對.NET核心 –

+0

@RonanThibaudau感謝您指出了這一點 - 幸運的是DNX版具有相同的接口:HTTPS:/ /github.com/dotnet/corefx/blob/master/src/System.IO.Compression/src/System/IO/Compression/ZipArchive.cs – Dai

+0

@戴謝謝,我會試試這個。感謝您的時間 – user2526804

0

這是如何將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); 
} 
相關問題