ساخت یک ZIP در حافظه مفید است هنگامی که شما نیاز به پخش یک دانلود، انتقال بایت ها به یک سرویس دیگر، و یا ذخیره یک آرشیو در یک پایگاه داده بدون لمس دیسک. Aspose.ZIP برای .NET یک API تمیز برای ایجاد اسناد زایپ با استفاده از جریان ها، انتخاب تنظیمات فشرده سازی و پس انداز نتایج به MemoryStream
یا به طور مستقیم به پاسخ HTTP.
این راهنمای کد کامل و صحیح را ارائه می دهد که می توانید در یک برنامه کنسول یا پروژه هسته ای ASP.NET قرار دهید.
پیش شرط
- .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();
**چرا توآری() در اینجا؟**API های حداقل نیاز به یک بار پرداخت واقعی دارند.برای آرشیو های بسیار بزرگ، ترجیح می دهید به طور مستقیم به 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
یا APipeWriter
- جریان را پشتیبانی کنید و آن را به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 های وب. - (تغییرمسیر در مسیرهای پیش رو)
/
برای رفتار مداوم در سراسر ابزارها
بررسی عملکرد
- Choose
CompressionLevel.Low
برای دانلود در زمان واقعی زمانی که سرعت بیشتر از اندازه مهم است. - اجتناب از بارگذاری ورودی های بزرگ به طور کامل به RAM؛ جریان از فایل ها و یا جریان های شبکه.
- برای فایل های چند گیگابایت بسیار بزرگ، به طور مستقیم به
HttpResponse.Body
یا یک جریان هدف دیگر به جای بوفری. - Dispose
Archive
و همه واردات به صورت تعیین کننده جریان می یابد.
FAQ
**آیا می توانم رمز عبور را در حافظه ZIP محافظت کنم؟**Aspose.ZIP از فایل های رمزگذاری شده ZIP پشتیبانی می کند. TraditionalEncryptionSettings
یا AesEncryptionSettings
از طریق ArchiveEntrySettings
درخواست برای ورود در هنگام تماس CreateEntry
.
**آیا می توانم یک ZIP موجود را که در حافظه بارگذاری کرده ام، به روز کنم؟**بله، آن را در یک Archive
, اضافه کردن یا حذف ورودی ها , سپس Save
بازگشت به جریان
**آیا این کار در سرویس برنامه های Azure یا کانتینرها انجام می شود؟**در حافظه و جریان زپینگ به خوبی در محیط های شن و ماسه ای کار می کند که در آن دسترسی به دیسک محدود است.
خلاصه
شما یک آرشیو ZIP به طور کامل در حافظه با Aspose.ZIP برای .NET، اضافه کردن ورودی از جریان ها، تنظیم فشرده سازی، و بازگرداندن اسناد از یک نقطه نهایی ASP.NET Core بدون فایل های موقت.