Att bygga en ZIP i minnet är användbart när du behöver strömma en nedladdning, överföra byter till en annan tjänst, eller lagra ett arkiv i en databas utan att röra på en skiva. Aspose.ZIP för .NET visar en ren API för att skapa zIP-arkiv med strömavbrott, välj komprimeringsinställningar och spara resultatet till MemoryStream
eller direkt till HTTP-responsen.
Denna guide ger fullständig, korrekt kod som du kan lägga in i en konsolapp eller ASP.NET Core-projektet.
förutsättningar
- .NET 6 eller senare
- Nu är:
Aspose.Zip
dotnet add package Aspose.Zip
Namnplatser som används:
using Aspose.Zip; // Archive, ArchiveEntry
using Aspose.Zip.Saving; // DeflateCompressionSettings, CompressionLevel
Snabb start: Skapa en ZIP helt i minnet
Det här exemplet lägger till poster från en sträng och en fil på skivan, sparar arkivet till en MemoryStream
, och exponerar den resulterande 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");
}
}
- Nyckelpunkter *
new Archive()
Skapa en tom zip.CreateEntry(entryName, stream, entrySettings)
Lägg till en fil från all läsbar ström.archive.Save(stream)
skriver arkivet till ditt valda flöde (minne, nätverk, svarkropp).
Lägg till ett helt mappträ utan att skriva tempfiler
Gå en katalog återkommande, bevara relativa vägar, och skriva det slutliga arkivet i minnet.
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: Stream en ZIP nedladdning utan disk I/O
Den här slutpunkten bygger en ZIP i minnet från flera källor och returnerar den med rätt innehållstyp och ett nedladdningsfilnamn.
// 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();
*Varför är det här? *Minimala APIs kräver en konkret laddning. För mycket stora arkiv, föredrar streaming direkt till 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);
});
Välj komprimeringsinställningar
DeflateCompressionSettings
Styr hastighet vs storlek:
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
Passera inställningarna via new ArchiveEntrySettings(deflate)
Du kan blanda inställningar per inmatning om det behövs.
Lägg till entréer från strömmar säkert
- Användning
File.OpenRead(path)
att strömma stora filer utan att ladda dem helt i minnet. - För genererat innehåll, skriv till en
MemoryStream
eller aPipeWriter
stödja strömmen och passera den tillCreateEntry
. - Skapa strömmar efter varje
CreateEntry
Fria resurser snabbt.
Exempel på stor genererad innehåll:
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);
}
Validering och felhantering
- Kontrollera inmatningar existerar innan du lägger till arkivet.
- Skapad skapelse i
try/catch
och returnera en tydlig HTTP-fel för webbapier. - Normalisera ingångsvägar med framsteg slashes (
/
för konsekvent beteende över alla verktyg.
Performance checklista
- Choose
CompressionLevel.Low
för realtids nedladdningar när hastighet är viktigare än storlek. - Undvik att ladda massiva ingångar helt in i RAM; ström från filer eller nätverksströmmar.
- För mycket stora multi-GB-filer, ström direkt till
HttpResponse.Body
eller ett annat målflöde istället för buffering. - Dispose
Archive
Och alla inmatningar strömmar deterministiskt.
FAQ
**Kan jag skydda lösenordet för in-memory ZIP?**Aspose.ZIP stöder krypterade ZIP-filer. TraditionalEncryptionSettings
eller AesEncryptionSettings
via ArchiveEntrySettings
Ansöka per ingång när du ringer CreateEntry
.
**Kan jag uppdatera en befintlig ZIP som jag laddat in i minnet?**Ja, ladda den in i en Archive
, lägga till eller ta bort poster, sedan Save
Tillbaka till en ström.
**Arbetar detta i Azure App Service eller behållare?**Ja. In-memory och streamed zipping fungerar bra i sandboxade miljöer där diskåtkomst är begränsad.
Sammanfattning
Du har skapat en ZIP-arkiv ** helt i minnet** med Aspose.ZIP för .NET, lagt till inmatningar från strömmar, justerad kompression och returnerat arkivet från en ASP.NET Core slutpunkt utan tillfälliga filer.