Изграждането на ZIP в паметта е полезно, когато трябва да потопите изтегляне, да прехвърлите байтове към друга услуга или да съхранявате архив в база данни, без да докосвате диска. Aspose.ZIP за .NET показва чиста API, за да създадете архиви Zip с помощта на потоци, изберете компресионни настройки и да запишете резултата в MemoryStream
или директно към HTTP отговор.
Този ръководство осигурява пълен, правилния код, който можете да вмъкнете в приложение за конзола или ASP.NET Core проект.
Предупреждения
- .NET 6 или по-късно
- НУГЕТ :
Aspose.Zip
dotnet add package Aspose.Zip
Използваните имена са:
using Aspose.Zip; // Archive, ArchiveEntry
using Aspose.Zip.Saving; // DeflateCompressionSettings, CompressionLevel
Бърз старт: създаване на ZIP изцяло в паметта
Този пример добавя записи от лента и файл на диска, съхранява архива в MemoryStream
, и излага произтичащия байт ареал.
// 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");
}
}
- Ключови точки *
new Archive()
Създава празен ZIP.CreateEntry(entryName, stream, entrySettings)
Добавяне на файл от всяка прочетена поток.archive.Save(stream)
пише архива към избрания ви поток (памет, мрежа, отговор).
Добавете цяло дърво на папката, без да пишете Temp файлове
Пътувайте директориума рецидивиращо, запазвайте относителните пътища и запишете окончателния архив в паметта.
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: прехвърляне на ZIP изтегляне без диск I/O
Тази крайна точка изгражда ZIP в паметта от няколко източника и го връща с правилния тип съдържание и името на файла за изтегляне.
// 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();
„Защо да се върнем тук?“Минималните АПИ изискват конкретна тежест.За много големи архиви, предпочитате да предавате директно на 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);
});
Изберете компресионни настройки
DeflateCompressionSettings
Контролиране на скоростта срещу размера:
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
Преминаване на настройките чрез new ArchiveEntrySettings(deflate)
Можете да смесите настройките по вход, ако е необходимо.
Добавяне на записи от потоците безопасно
- Използване
File.OpenRead(path)
Да предавате големи файлове, без да ги зареждате напълно в паметта. - За генерираното съдържание, напишете на
MemoryStream
или АPipeWriter
- подкрепя потока и го прехвърля наCreateEntry
. - Направете поток след всеки
CreateEntry
Бързо да се осигурят свободни ресурси.
Пример за голямо генерирано съдържание:
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);
}
Валидиране и обработка на грешки
- Проверете вноските съществуват, преди да добавите към архива.
- Създаване в
try/catch
и връщане на ясна HTTP грешка за уеб APIs. - Входни маршрути с напреднали слайдове (
/
За последователно поведение в инструментите.
Проверка на изпълнението
- Choose
CompressionLevel.Low
за изтегляния в реално време, когато скоростта е по-голяма от размера. - Избягвайте натоварването на масивни записи напълно в RAM; поток от файлове или мрежови потоци.
- За много големи мулти-ГБ архиви, тече директно към
HttpResponse.Body
или друг целенасочен поток вместо буфер. - Dispose
Archive
И всички входни потоци текат детерминистично.
FAQ
**Мога ли да защитя паролата в паметта ZIP?**Aspose.ZIP поддържа шифровани ZIP архиви. TraditionalEncryptionSettings
или AesEncryptionSettings
чрез ArchiveEntrySettings
Заявление по вход при обаждане CreateEntry
.
**Мога ли да актуализирам съществуващ ZIP, който съм зареждал в паметта?**Да. Направете го в една Archive
Добавяне или премахване на записи, след това Save
Връщане към потока.
**Работи ли това в Azure App Service или в контейнери?**Да. В паметта и потока zipping работи добре в песочни среди, където достъпът до диска е ограничен.
Резюме
Създадохте ZIP архива изцяло в памет с Aspose.ZIP за .NET, добавихте записи от потоците, персонализирате компресията и върнахте архивата от крайната точка ASP.NET Core без временни файлове.