web-dev-qa-db-fra.com

Créez Zip dans .net Core à partir d'URL sans télécharger sur le serveur

J'ai la liste des URL Internet que j'essaye de créer un zip avec Memorystream. Les fichiers se trouvent sur le compartiment s3, mais s3 sdk n’a aucune fonction permettant de télécharger un dossier au format Zip. 

Éviter de l'enregistrer sur le serveur et de les supprimer. Le projet fonctionne sur Ubuntu. J'ai essayé d'obtenir la réponse comme suit,

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

Cependant, la classe ZipArchive dans .NET prend le chemin des fichiers locaux et non le memorystream

Remarque: je ne peux pas utiliser SharpZipLib car il n'est pas pris en charge par .NET Core. 

7
user2526804

Cependant, la classe ZipArchive dans .NET prend le chemin des fichiers locaux et non le memorystream

Ceci est faux, la classe ZipArchive a des surcharges qui acceptent des instances Stream:

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

Initialise une nouvelle instance de la classe ZipArchive à partir du flux spécifié.

public ZipArchive(Stream stream)

(La documentation concerne l'intégralité du .NET Framework, mais l'implémentation .NET Core a la même interface: https://github.com/dotnet/corefx/blob/master/src/System.IO.Compression/src/System /IO/Compression/ZipArchive.cs )

Ainsi:

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
}
14
Dai

C’est ainsi que xml Doc peut être compressé et téléchargé sur aws S3, dans l’espoir d’aider quelqu'un.

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
Gevorg Gevorgyan