Vraag Hoe maak en vul je een ZIP-bestand met ASP.NET?


Moet u sommige bestanden dynamisch verpakken in een .zip om een ​​SCORM-pakket te maken, weet iemand hoe dit met behulp van code kan worden gedaan? Is het mogelijk om de mapstructuur ook dynamisch in de .zip te bouwen?


23
2018-03-25 14:29


oorsprong


antwoorden:


U hoeft geen externe bibliotheek meer te gebruiken. System.IO.Packaging heeft klassen die kunnen worden gebruikt om inhoud in een zipbestand te plaatsen. Het is echter niet eenvoudig. Hier is een blogpost met een voorbeeld (het is aan het einde, graaf er voor).


De link is niet stabiel, dus hier is het voorbeeld dat Jon in de post heeft gegeven.

using System;
using System.IO;
using System.IO.Packaging;

namespace ZipSample
{
    class Program
    {
        static void Main(string[] args)
        {
            AddFileToZip("Output.zip", @"C:\Windows\Notepad.exe");
            AddFileToZip("Output.zip", @"C:\Windows\System32\Calc.exe");
        }

        private const long BUFFER_SIZE = 4096;

        private static void AddFileToZip(string zipFilename, string fileToAdd)
        {
            using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate))
            {
                string destFilename = ".\\" + Path.GetFileName(fileToAdd);
                Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
                if (zip.PartExists(uri))
                {
                    zip.DeletePart(uri);
                }
                PackagePart part = zip.CreatePart(uri, "",CompressionOption.Normal);
                using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
                {
                    using (Stream dest = part.GetStream())
                    {
                        CopyStream(fileStream, dest);
                    }
                }
            }
        }

        private static void CopyStream(System.IO.FileStream inputStream, System.IO.Stream outputStream)
        {
            long bufferSize = inputStream.Length < BUFFER_SIZE ? inputStream.Length : BUFFER_SIZE;
            byte[] buffer = new byte[bufferSize];
            int bytesRead = 0;
            long bytesWritten = 0;
            while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                outputStream.Write(buffer, 0, bytesRead);
                bytesWritten += bytesRead;
            }
        }
    }
}

15
2018-03-25 14:52



DotNetZip is leuk hiervoor. Werkend voorbeeld

U kunt de zip rechtstreeks naar de Response.OutputStream schrijven. De code ziet er zo uit:

    Response.Clear();
    Response.BufferOutput = false; // for large files...
    System.Web.HttpContext c= System.Web.HttpContext.Current;
    String ReadmeText= "Hello!\n\nThis is a README..." + DateTime.Now.ToString("G"); 
    string archiveName= String.Format("archive-{0}.zip", 
                                      DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); 
    Response.ContentType = "application/zip";
    Response.AddHeader("content-disposition", "filename=" + archiveName);

    using (ZipFile zip = new ZipFile())
    {
        // filesToInclude is an IEnumerable<String>, like String[] or List<String>
        zip.AddFiles(filesToInclude, "files");            

        // Add a file from a string
        zip.AddEntry("Readme.txt", "", ReadmeText);
        zip.Save(Response.OutputStream);
    }
    // Response.End();  // no! See http://stackoverflow.com/questions/1087777
    Response.Close();

DotNetZip is gratis.


21
2018-03-26 06:24



Je zou eens kunnen kijken SharpZipLib. En hier is een monster.


7
2018-03-25 14:32



DotNetZip is heel gemakkelijk te gebruiken ... ZIP-bestanden maken in ASP.Net


3
2018-02-25 16:51



Ik heb hiervoor een gratis component van chilkat gebruikt: http://www.chilkatsoft.com/zip-dotnet.asp. Heeft vrijwel alles wat ik nodig heb, maar ik weet niet zeker of de bestandsstructuur dynamisch moet worden opgebouwd.


1
2018-03-25 14:34



In staat om dit te doen met behulp van DotNetZip. je kunt het downloaden vanuit de visagestudio Nuget pakkettanger of rechtstreeks via de DotNetZip. probeer dan onderstaande code,

     /// <summary>
    /// Generate zip file and save it into given location
    /// </summary>
    /// <param name="directoryPath"></param>
    public void CreateZipFile(string directoryPath )
    {
        //Select Files from given directory
        List<string> directoryFileNames = Directory.GetFiles(directoryPath).ToList();
        using (ZipFile zip = new ZipFile())
        {
            zip.AddFiles(directoryFileNames, "");
            //Generate zip file folder into loation
            zip.Save("C:\\Logs\\ReportsMyZipFile.zip");
        }
    }

Als u het bestand naar de client wilt downloaden, gebruikt u de onderstaande code.

/// <summary>
    /// Generate zip file and download into client
    /// </summary>
    /// <param name="directoryPath"></param>
    /// <param name="respnse"></param>
    public void CreateZipFile(HttpResponse respnse,string directoryPath )
    {
        //Select Files from given directory
        List<string> directoryFileNames = Directory.GetFiles(directoryPath).ToList();
        respnse.Clear();
        respnse.BufferOutput = false;
        respnse.ContentType = "application/zip";
        respnse.AddHeader("content-disposition", "attachment; filename=MyFiles.zip");

        using (ZipFile zip = new ZipFile())
        {
            zip.CompressionLevel = CompressionLevel.None;
            zip.AddFiles(directoryFileNames, "");
            zip.Save(respnse.OutputStream);
        }

        respnse.flush();
    }

1
2018-04-12 15:21



Het creëren van ZIP-bestand "on the fly" zou worden gedaan met behulp van onze Rebex ZIP component.

Het volgende voorbeeld beschrijft het volledig, inclusief het maken van een submap:

// prepare MemoryStream to create ZIP archive within
using (MemoryStream ms = new MemoryStream())
{
    // create new ZIP archive within prepared MemoryStream
    using (ZipArchive zip = new ZipArchive(ms))
    {            
         // add some files to ZIP archive
         zip.Add(@"c:\temp\testfile.txt");
         zip.Add(@"c:\temp\innerfile.txt", @"\subfolder");

         // clear response stream and set the response header and content type
         Response.Clear();
         Response.ContentType = "application/zip";
         Response.AddHeader("content-disposition", "filename=sample.zip");

         // write content of the MemoryStream (created ZIP archive) to the response stream
         ms.WriteTo(Response.OutputStream);
    }
}

// close the current HTTP response and stop executing this page
HttpContext.Current.ApplicationInstance.CompleteRequest();

0
2017-09-16 13:52



Als u .NET Framework 4.5 of nieuwer gebruikt, kunt u bibliotheken van derden vermijden en de .bibliotheek gebruiken System.IO.Compression.ZipArchive native class.

Hier is een snel codevoorbeeld met behulp van een MemoryStream en een paar byte-arrays die twee bestanden voorstellen:

byte[] file1 = GetFile1ByteArray();
byte[] file2 = GetFile2ByteArray();

using (MemoryStream ms = new MemoryStream())
{
    using (var archive = new ZipArchive(ms, ZipArchiveMode.Create, true))
    {
        var zipArchiveEntry = archive.CreateEntry("file1.txt", CompressionLevel.Fastest);
        using (var zipStream = zipArchiveEntry.Open()) zipStream.Write(file1, 0, file1.Length);
        zipArchiveEntry = archive.CreateEntry("file2.txt", CompressionLevel.Fastest);
        using (var zipStream = zipArchiveEntry.Open()) zipStream.Write(file2, 0, file2.Length);
    }
    return File(ms.ToArray(), "application/zip", "Archive.zip");
}

Je kunt het gebruiken in een MVC-controller die een ActionResult: alternatief, als u het ZIP-archief op een praktische manier moet maken, kunt u het MemoryStream naar schijf of volledig vervangen door een FileStream.

Voor meer informatie over dit onderwerp kunt u ook lees dit bericht.


0
2018-05-17 19:07