Създаването на ZIP в паметта е полезно, когато трябва да стриймвате изтегляне, предавате байтове към друга услуга или съхранявате архив в база данни, без да докосвате диска. Aspose.ZIP for .NET предоставя чист API за създаване на ZIP архиви чрез потоци, избор на настройки за компресия и запазване на резултата в MemoryStream или директно в HTTP отговора.
Това ръководство предоставя пълен, коректен код, който можете да поставите в конзолно приложение или проект ASP.NET Core.
Предпоставки
- .NET 6 или по-нов
- NuGet:
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();
var entrySettings = new ArchiveEntrySettings(deflate);
using (var archive = new Archive())
{
// 1) Add a text file from memory
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 = "archive.zip"; // ensure it exists
if (File.Exists(sourcePath))
{
var fs = File.OpenRead(sourcePath);
archive.CreateEntry("reports/2025/report.pdf", fs, entrySettings);
// keep the stream open until after saving
archive.Save(zipBuffer);
fs.Dispose();
}
else
{
// Save when the file entry is not added
archive.Save(zipBuffer);
}
ms.Dispose();
}
// 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)записва архива във вашия избран поток (памет, мрежа, тяло на отговора).
Добавете цялото дърво от папки без създаване на временни файлове
Обходете директория рекурсивно, запазете относителните пътища и запишете окончателния архив в паметта.
using System.IO;
using Aspose.Zip;
using Aspose.Zip.Saving;
static class InMemoryZipper
{
public static byte[] ZipFolderToBytes(string sourceFolder)
{
if (!Directory.Exists(sourceFolder))
throw new DirectoryNotFoundException(sourceFolder);
var deflate = new DeflateCompressionSettings();
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 в паметта от множество източници и го връща с правилния тип съдържание и име на файл за изтегляне.
using System;
using System.IO;
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();
var settings = new ArchiveEntrySettings(deflate);
using (var archive = new Archive())
{
var ms = new MemoryStream(Encoding.UTF8.GetBytes("id,name\n1,Alice\n2,Bob\n"));
archive.CreateEntry("data/users.csv", ms, settings);
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);
ms.Dispose();
}
buffer.Position = 0;
return Results.File(
fileContents: buffer.ToArray(),
contentType: "application/zip",
fileDownloadName: $"bundle-{DateTime.UtcNow:yyyyMMdd-HHmmss}.zip");
});
await app.StartAsync();
await app.StopAsync();
Console.WriteLine("ASP.NET app validated.");
Защо ToArray() тук? Minimal APIs изискват конкретен payload. За много големи архиви, предпочитайте директно поточно предаване към 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);
});
Изберете настройки за компресия
Aspose.ZIP поддържа няколко алгоритъма за компресия. Всеки е отделен клас, наследен от CompressionSettings:
using Aspose.Zip.Saving;
var deflate = new DeflateCompressionSettings(); // standard ZIP Deflate — best compatibility
var bzip2 = new Bzip2CompressionSettings(); // better compression ratio, slower
var lzma = new LzmaCompressionSettings(); // best compression ratio, slowest
var store = new StoreCompressionSettings(); // no compression — fastest (for pre-compressed files)
// Use Deflate for standard ZIP compatibility:
var entrySettings = new ArchiveEntrySettings(deflate);
Предайте настройките чрез new ArchiveEntrySettings(compressionSettings) при създаване на записи. Можете да смесвате различни алгоритми за всеки запис — например, да съхранявате предварително компресирани изображения, докато компресирате текстови файлове с 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());
archive.CreateEntry(name, temp, settings);
}
Валидация и обработка на грешки
- Проверете дали входните данни съществуват, преди да ги добавите към архива.
- Обвийте създаването в
try/catchи върнете ясна HTTP грешка за уеб API‑та. - Нормализирайте пътищата на елементите с наклонени черти (
/) за последователно поведение в различни инструменти.
Контролен списък за производителност
- Изберете
CompressionLevel.Lowза изтегляния в реално време, когато скоростта е по-важна от размера. - Избягвайте пълното зареждане на масивни елементи в RAM; поточно ги чете от файлове или мрежови потоци.
- За много големи многога GB архиви, предайте директно към
HttpResponse.Bodyили към друг целеви поток вместо буфериране. - Освободете
Archiveи всички входни потоци детерминистично.
FAQ
Мога ли да защитя с парола ZIP в паметта? Aspose.ZIP поддържа криптирани ZIP архиви. Използвайте TraditionalEncryptionSettings или AesEncryptionSettings чрез ArchiveEntrySettings. Прилагайте за всеки елемент при извикване CreateEntry.
Мога ли да актуализирам съществуващ ZIP, който съм заредил в паметта? Да. Заредете го в Archive, добавете или премахнете записи, след това Save обратно към поток.
Работи ли това в Azure App Service или контейнери? Да. Компресирането в памет и чрез потоци работи добре в изолирани среди, където достъпът до диска е ограничен.
Обобщение
Създадохте ZIP архив изцяло в паметта с Aspose.ZIP for .NET, добавихте записи от потоци, настроихте компресията и върнахте архива от an ASP.NET Core крайна точка без временни файлове. Използвайте тези шаблони, за да генерирате изтегляния, пакети и експорти ефективно във вашите C# приложения.