web-dev-qa-db-ja.com

サーバーにダウンロードせずにURLから.netCoreでZipを作成する

Memorystreamを使用してZipを作成しようとしているインターネットURLのリストがあります。ファイルはs3バケットにありますが、s3sdkにはフォルダを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でサポートされていないため、使用できません。

8
user2526804

ただし、.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/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
}
16
Dai

これは、xmlDocをzipしてawsS3にアップロードする方法です。誰かの助けになることを願っています。

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);
}
1