example - ¿Cómo crear y rellenar un archivo ZIP con ASP.NET?
ziparchive c# (8)
¿Es necesario empaquetar dinámicamente algunos archivos en un .zip para crear un paquete SCORM? ¿Alguien sabe cómo se puede hacer esto usando código? ¿Es posible construir la estructura de la carpeta dinámicamente dentro del .zip también?
Capaz de hacer esto usando DotNetZip. Puede descargarlo desde el gestor de paquetes de Visual Studio Nuget o directamente a través de DotnetZip . a continuación, intente código debajo,
/// <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");
}
}
Si desea descargar el archivo en el cliente, utilice el siguiente código.
/// <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();
}
DotNetZip es muy fácil de usar ... Creando archivos Zip en ASP.Net
He utilizado un componente gratuito de chilkat para esto: http://www.chilkatsoft.com/zip-dotnet.asp . Hace prácticamente todo lo que he necesitado, pero no estoy seguro de cómo construir dinámicamente la estructura de archivos.
La creación del archivo ZIP "sobre la marcha" se haría usando nuestro componente Rebex ZIP .
El siguiente ejemplo lo describe completamente, incluida la creación de una subcarpeta:
// 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();
Podrías echar un vistazo a SharpZipLib . Y aquí hay una sample .
Si está utilizando .NET Framework 4.5 o más reciente, puede evitar las bibliotecas de terceros y usar la clase nativa System.IO.Compression.ZipArchive
.
Aquí hay un ejemplo de código rápido que utiliza un MemoryStream y un par de matrices de bytes que representan dos archivos:
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");
}
Puede usarlo dentro de un controlador MVC que devuelve un ActionResult
: alternativamente, si necesita crear físicamente el archivo zip, puede conservar el MemoryStream
en el disco o reemplazarlo por completo con un FileStream
.
Para obtener más información sobre este tema, también puede leer esta publicación en mi blog.
Ya no tienes que usar una biblioteca externa. System.IO.Packaging tiene clases que se pueden usar para colocar contenido en un archivo zip. Sin embargo, no es simple. Aquí hay una publicación de blog con un ejemplo (está al final; cava para obtenerla).
El enlace no es estable, así que aquí está el ejemplo que Jon proporcionó en la publicación.
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;
}
}
}
}
DotNetZip es bueno para esto. Ejemplo de trabajo
Puede escribir el zip directamente en el Response.OutputStream. El código se ve así:
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://.com/questions/1087777
Response.Close();
DotNetZip es gratis.