สร้าง ZIP ในหน่วยความจําเป็นประโยชน์เมื่อคุณจําเป็นต้องสตรีมดาวน์โหลดไบต์ไปยังบริการอื่นหรือจัดเก็บไฟล์ในฐานข้อมูลโดยไม่ต้องสัมผัสไดรฟ์ Aspose.ZIP สําหรับ .NET แสดง API ที่สะอาดเพื่อสร้างไฟล์ Zip โดยใช้การไหล เลือกการตั้งค่าการบีบอัดและบันทึกผลให้เข้าสู่ระบบ 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)เพิ่มไฟล์จาก ใด ๆ Stream ที่สามารถอ่านได้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();
** ทําไม ToArray() ที่นี่?**API น้อยที่สุดต้องใช้ค่าธรรมเนียมแบบ concrete สําหรับไฟล์ขนาดใหญ่มากโปรดส่งโดยตรงไปยัง 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 การควบคุมความเร็ว vs ขนาด:
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) เมื่อสร้างรายการ คุณสามารถผสมการตั้งค่าต่อรายการถ้าจําเป็น
เพิ่มการเข้าสู่ระบบจาก Streams อย่างปลอดภัย
- ใช
File.OpenRead(path)กระแสไฟล์ขนาดใหญ่โดยไม่ต้องโหลดไฟล์ทั้งหมดลงในหน่วยความจํา - สําหรับเนื้อหาที่สร้างการเขียนไปยัง A
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);
}
การรับรองและการจัดการข้อผิดพลาด
- ตรวจสอบรายการที่มีอยู่ก่อนที่จะเพิ่มไปยังเอกสาร
- Wrap การสร้างใน
try/catchและกลับข้อผิดพลาด HTTP ที่ชัดเจนสําหรับเว็บ APIs - ปกติเส้นทางเข้าด้วย slashes ด้านหน้า (
/) สําหรับพฤติกรรมที่สม่ําเสมอระหว่างเครื่องมือ
รายการการตรวจสอบประสิทธิภาพ
- Choose
CompressionLevel.Lowสําหรับการดาวน์โหลดในเวลาจริงเมื่อความเร็วมีความสําคัญมากกว่าขนาด - หลีกเลี่ยงการโหลดรายการขนาดใหญ่เต็มรูปแบบใน RAM; การไหลจากไฟล์หรือการไหลเครือข่าย
- สําหรับไฟล์หลายGB ขนาดมาก stream directly to
HttpResponse.Bodyหรือกระแสเป้าหมายอื่นแทนที่จะบูเฟอร์ - Dispose
Archiveและทั้งหมดการส่งเข้าจะไหลตามที่กําหนดเอง
FAQ
** ฉันสามารถป้องกันรหัสผ่าน ZIP ในหน่วยความจําได้หรือไม่**Aspose.ZIP สนับสนุนไฟล์ ZIP ที่เข้ารหัส ใช้ TraditionalEncryptionSettings หรือ AesEncryptionSettings ผ่าน ArchiveEntrySettings. การสมัครโดยการเข้าสู่ระบบเมื่อโทร CreateEntry.
** ฉันสามารถอัปเดต ZIP ที่มีอยู่ที่ฉันโหลดลงในหน่วยความจําได้หรือไม่**ใช่. ดาวน์โหลดไว้ใน Archive, เพิ่มหรือลบรายการแล้ว Save กลับไปสู่การไหล
มันทํางานใน Azure App Service หรือคอนเทนเนอร์หรือไม่ใช่ การเชื่อมต่อในหน่วยความจําและสตรีมทํางานได้ดีในสภาพแวดล้อมที่มี Sandbox ที่การเข้าถึงดิสก์ จํากัด
คําอธิบาย
คุณได้สร้างไฟล์ ZIP สมบูรณ์ในหน่วยความจํา ด้วย Aspose.ZIP สําหรับ .NET, เพิ่มรายการจาก Streams, ปรับการบีบอัดและกลับไฟล์จากจุดสิ้นสุด ASP.NET Core โดยไม่มีไฟล์ชั่วคราว ใช้รูปแบบเหล่านี้เพื่อสร้างดาวน์โหลดแพคเกจและส่งออกได้อย่างมีประสิทธิภาพในแอพ C# ของคุณ