Izgradnja ZIP-a u pamćenju je korisna kada morate prenijeti prijenos, prebaciti bajte na drugu uslugu ili pohraniti arhiv u bazi podataka bez dodirivanja diska. Aspose.ZIP za .NET izloži čistu API za stvaranje zIP arhiva pomoću tokova, odaberite postavke kompresije i sačuvajte rezultat na MemoryStream
ili izravno na HTTP odgovor.
Ovaj vodič pruža potpuni, ispravan kod koji možete staviti u aplikaciju konzole ili ASP.NET Core projekt.
Preduzeća
- .NET 6 ili kasnije
- Slijedeći :
Aspose.Zip
dotnet add package Aspose.Zip
Korišteno ime prostora:
using Aspose.Zip; // Archive, ArchiveEntry
using Aspose.Zip.Saving; // DeflateCompressionSettings, CompressionLevel
Brz početak: stvaranje ZIP-a u potpunosti u memoriji
Ovaj primjer dodaje ulaznice iz vrpca i datoteku na disku, čuva arhiv na MemoryStream
, i izloži rezultirani byte array.
// File: Program.cs
using System;
using System.IO;
using System.Text;
using Aspose.Zip;
using Aspose.Zip.Saving;
class Program
{
static void Main()
{
// Prepare output buffer
using var zipBuffer = new MemoryStream();
// Choose compression (Deflate is the standard ZIP method)
var deflate = new DeflateCompressionSettings(CompressionLevel.Normal);
var entrySettings = new ArchiveEntrySettings(deflate);
using (var archive = new Archive())
{
// 1) Add a text file from memory
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("Hello from Aspose.ZIP in memory.")))
{
archive.CreateEntry("docs/readme.txt", ms, entrySettings);
}
// 2) Add a file from disk (streamed; not fully loaded in RAM)
var sourcePath = "report.pdf"; // ensure it exists
if (File.Exists(sourcePath))
{
using var fs = File.OpenRead(sourcePath);
archive.CreateEntry("reports/2025/report.pdf", fs, entrySettings);
}
// 3) Save the ZIP to our in-memory buffer
archive.Save(zipBuffer);
}
// Use the ZIP bytes as needed (send over network, write to DB, etc.)
byte[] zipBytes = zipBuffer.ToArray();
Console.WriteLine($"ZIP size: {zipBytes.Length} bytes");
}
}
- Ključne točke *
new Archive()
Stvoriti prazan ZIP.CreateEntry(entryName, stream, entrySettings)
Dodava datoteku iz svaki čitljivi tok.archive.Save(stream)
napisati arhiv na vašem odabranom toku (memorija, mreža, tijelo odgovora).
Dodajte cijelo drvo mape bez pisanja temp datoteke
Izađite u direktorije recursivno, sačuvajte relativne staze i napišite konačni arhiv u memoriju.
using System.IO;
using Aspose.Zip;
using Aspose.Zip.Saving;
static class InMemoryZipper
{
public static byte[] ZipFolderToBytes(string sourceFolder, CompressionLevel level = CompressionLevel.Normal)
{
if (!Directory.Exists(sourceFolder))
throw new DirectoryNotFoundException(sourceFolder);
var deflate = new DeflateCompressionSettings(level);
var entrySettings = new ArchiveEntrySettings(deflate);
using var buffer = new MemoryStream();
using (var archive = new Archive())
{
var root = Path.GetFullPath(sourceFolder);
foreach (var filePath in Directory.GetFiles(root, "*", SearchOption.AllDirectories))
{
var rel = Path.GetRelativePath(root, filePath).Replace(Path.DirectorySeparatorChar, '/');
using var fs = File.OpenRead(filePath);
archive.CreateEntry(rel, fs, entrySettings);
}
archive.Save(buffer);
}
return buffer.ToArray();
}
}
ASP.NET Core: prijenos ZIP preuzimanje bez diska I/O
Ova završna točka gradi ZIP u memoriju iz više izvora i vraća ga s ispravnim tipom sadržaja i imenom za preuzimanje.
// File: Program.cs (minimal API)
using System.Text;
using Aspose.Zip;
using Aspose.Zip.Saving;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/download-zip", () =>
{
using var buffer = new MemoryStream();
var deflate = new DeflateCompressionSettings(CompressionLevel.Normal);
var settings = new ArchiveEntrySettings(deflate);
using (var archive = new Archive())
{
// Add dynamic content (for example, a CSV generated on the fly)
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("id,name\n1,Alice\n2,Bob\n")))
archive.CreateEntry("data/users.csv", ms, settings);
// Add a static file from disk if available
var logo = "wwwroot/logo.png";
if (File.Exists(logo))
{
using var fs = File.OpenRead(logo);
archive.CreateEntry("assets/logo.png", fs, settings);
}
archive.Save(buffer);
}
buffer.Position = 0; // rewind for reading
return Results.File(
fileContents: buffer.ToArray(),
contentType: "application/zip",
fileDownloadName: $"bundle-{DateTime.UtcNow:yyyyMMdd-HHmmss}.zip");
});
app.Run();
- Zašto se ovdje nalazimo? *Minimalni API zahtijevaju konkretan teret. za vrlo velike arhive, preferirajte prijenos izravno na
HttpResponse.Body
:
app.MapGet("/stream-zip", async (HttpContext ctx) =>
{
ctx.Response.ContentType = "application/zip";
ctx.Response.Headers.ContentDisposition = $"attachment; filename=\"bundle.zip\"";
var deflate = new DeflateCompressionSettings(CompressionLevel.Normal);
var settings = new ArchiveEntrySettings(deflate);
using var archive = new Archive();
// Add entries...
using var ms = new MemoryStream(Encoding.UTF8.GetBytes("hello"));
archive.CreateEntry("hello.txt", ms, settings);
// Stream directly to the client without buffering full ZIP in RAM
await archive.SaveAsync(ctx.Response.Body);
});
Izaberite kompresijske postavke
DeflateCompressionSettings
Kontrola brzine protiv veličine:
var fastest = new DeflateCompressionSettings(CompressionLevel.Low); // fastest, larger files
var balanced = new DeflateCompressionSettings(CompressionLevel.Normal); // default balance
var smallest = new DeflateCompressionSettings(CompressionLevel.High); // slowest, smallest files
Provedite postavke putem new ArchiveEntrySettings(deflate)
prilikom stvaranja ulazaka. možete miješati postavke po ulazu ako je potrebno.
Dodajte ulaznice iz tokova sigurno
- Korištenje
File.OpenRead(path)
za prijenos velikih datoteka bez punog preuzimanja u memoriju. - Za sadržaj koji se generira, pišite na
MemoryStream
ili aPipeWriter
- podržava protok i prenosi ga naCreateEntry
. - Slijedeći članakSvijet Poslije svakog
CreateEntry
Brzo se oslobađaju resursi.
Primjer velikog generiranog sadržaja:
using System.IO;
using Aspose.Zip;
using Aspose.Zip.Saving;
static void AddLargeGeneratedEntry(Archive archive, string name)
{
// simulate a big stream produced incrementally
using var temp = new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, FileOptions.DeleteOnClose);
using var writer = new StreamWriter(temp);
for (int i = 0; i < 200_000; i++) writer.WriteLine($"row-{i},value-{i}");
writer.Flush();
temp.Position = 0;
var settings = new ArchiveEntrySettings(new DeflateCompressionSettings(CompressionLevel.Normal));
archive.CreateEntry(name, temp, settings);
}
Validacija i rješavanje pogrešaka
- Provjerite ulaznice postoje prije dodavanja u arhiv.
- Stvaranje u
try/catch
i vratiti jasnu HTTP pogrešku za web APIs. - Slijedeći članakNormalizirajte ulazne staze s prednjim slashama (
/
za dosljedno ponašanje na svim instrumentima.
Pregled performansi
- Choose
CompressionLevel.Low
U realnom vremenu, kada brzina znači više od veličine. - Izbjegavajte punjenje masivnih ulazaka u RAM-u; protok iz datoteka ili mrežnih tokova.
- Za vrlo velike multi-GB arhive, prijenos izravno na
HttpResponse.Body
ili još jedan ciljni tok umjesto buffering. - Dispose
Archive
I sve ulazne struje deterministički.
FAQ
**Mogu li zaštititi lozinku u memoriji?**Aspose.ZIP podržava šifrirane ZIP arhive. TraditionalEncryptionSettings
ili AesEncryptionSettings
preko ArchiveEntrySettings
Prijavite se po ulasku prilikom poziva CreateEntry
.
**Mogu li ažurirati postojeći ZIP koji sam preuzela u memoriju?**Da, stavite ga u Archive
dodati ili ukloniti ulaznice, a zatim Save
Povratak u struju.
**Da li to radi u Azure App Service ili kontejnerima?**In-memory i streamed zipping dobro rade u pješčanim okruženjima gdje je pristup disku ograničen.
sažetak
Stvorili ste ZIP arhiv potpuno u memoriji s Aspose.ZIP za .NET, dodali ulaznice iz tokova, prilagođeni kompresije, i vratili arhivo iz završetka ASP.NET Core bez privremenih datoteka.