Будівництво ZIP в пам’яті корисно, коли вам потрібно передавати завантаження, переносити байти на іншу послугу або зберігати архіви в базі даних без дотикування диска. Aspose.ZIP для .NET виявляє чистий API для створення ЗIP архівів за допомогою потоків, вибирає налаштування компресії і зберігає результат на 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)
записує архіви до вибраного потоку (пам’ять, мережа, відповідний корпус).
Додайте цілий папковий дерево без написання темних файлів
Прогулянка в каталозі рецидиви, збереження релативних шляхів, і написання кінцевого архіву в пам’ять.
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 для веб-API. - Попередня статтяКто чего не ест (
/
1) для постійного поведінки між інструментами.
Перевірка продуктивності
- Choose
CompressionLevel.Low
Завантаження в реальному часі, коли швидкість важлива більше, ніж розмір. - Уникайте завантаження масових входів повністю в RAM; потоки з файлів або мережевих потоків.
- Для дуже великих мульти-ГБ файлів, потоки безпосередньо до
HttpResponse.Body
або інший цільовий потік замість буфера. - Dispose
Archive
І всі вхідні потоки детертимістично.
FAQ
** Чи можу я захистити пароль в пам’яті ZIP?**Aspose.ZIP підтримує зашифровані ZIP архіви. TraditionalEncryptionSettings
або AesEncryptionSettings
через ArchiveEntrySettings
Заявка на вхід під час дзвінка CreateEntry
.
** Чи можу я оновити існуючий ZIP, який я завантажив в пам’ять?**Завантажити його в один Archive
, додати або видалити записи, а потім Save
Повернення до потоку.
** Чи працює це в Azure App Service або контейнерах?**В пам’яті і в потоці з’єднання добре працює в піщаних середовищах, де доступ до диска обмежений.
резюме
Ви створили файл ZIP ** повністю в пам’яті** з Aspose.ZIP для .NET, додали записи з потоків, налаштували компресію, а також повернули файл з кінцевої точки ASP.NET Core без тимчасових файлів.