在内存中构建一个ZIP是有用的,当您需要播放下载,将比特转移到另一个服务,或在没有触摸磁盘的数据库中存储一个档案时。 Aspose. ZIP for .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) 添加来自 ** 任何可阅读流** 的文件。
  • 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:无磁盘 I/O 播放 ZIP 下载

此端点构建来自多个来源的 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();

為什麼在這裡( )?最小的APIs需要具体的付费负载.对于非常大的档案,最好直接播放到 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) 当创建输入时,您可以根据需要混合输出设置。

安全地从流中添加输入

  • 使用 File.OpenRead(path) 播放大文件,而无需将其全部加载到记忆中。
  • 对于创建的内容,写到一个 MemoryStream 或A 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);
}

验证和错误处理

  • 在添加到档案之前,检查输入。
  • Wrap 创作 try/catch 并返回一个明确的 HTTP 错误为 Web APIs。
  • 通往前方的路径(/(一)在各式各样的工具中进行一致的行为。

性能检查列表

  • Choose CompressionLevel.Low 在实时下载时,速度比大小更重要。
  • 避免充电大量输入完全进入RAM;流从文件或网络流。
  • 对于非常大的多GB档案,直接流到 HttpResponse.Body 或者另一个目标流,而不是泡沫。
  • Dispose Archive 所有的输入都以决定性方式流动。

FAQ

**我可以使用密码保护内存ZIP吗?**Aspose.ZIP 支持加密的 ZIP档案。 TraditionalEncryptionSettingsAesEncryptionSettings 通过 ArchiveEntrySettings按入口申请,当呼叫时 CreateEntry.

**我可以更新我记忆中加载的现有ZIP吗?**是的,把它放在一个 Archive,添加或删除输入,然后 Save 回到流。

**在 Azure App Service 或集装箱中工作吗?**是的,内存和流动的粘贴在磁盘接入有限的沙盒环境中工作得很好。

总结

您创建了一个 ZIP 存档 ** 完全在记忆中** 使用 Aspose.ZIP for .NET,添加了流的输入,调整了压缩,并从一个 ASP.NET Core 的终端点返回了文件,没有暂时的文件。

More in this category