메모리에 ZIP를 구축하는 것은 다운로드를 스트리밍하고, 바이트를 다른 서비스로 전송하거나, 디스크를 만지지 않고 데이터베이스에 아카이브를 저장할 필요가있을 때 유용합니다. Aspose.ZIP for .NET는 흐름을 사용하여 Z IP 파일을 만들기위한 깨끗한 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 코어: 디스크 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) 메모리에 완전히 충전하지 않고 큰 파일을 스트리밍합니다.
  • 생성 된 콘텐츠를 위해, A에 글을 쓰십시오. 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);
}

인증 및 오류 처리

  • 아카이브에 추가하기 전에 입력을 확인합니다.
  • 창조에 삽입 try/catch 그리고 웹 APIs에 대한 명확한 HTTP 오류를 반환합니다.
  • 정기적 인 출입 경로와 앞으로 슬라이드 (/1) 모든 도구에 대한 일관된 행동을 위해.

성과 체크리스트

  • Choose CompressionLevel.Low 속도가 크기보다 더 중요할 때 실시간 다운로드.
  • RAM에 대량 입력을 완전히 충전하는 것을 피하십시오; 파일이나 네트워크 스트림에서 흐름.
  • 매우 큰 멀티GB 아카이브를 위해, 직접 스트리밍 HttpResponse.Body 또는 다른 타겟 스트림 대신 버퍼링.
  • Dispose Archive 그리고 모든 입력은 결정적으로 흐르고 있습니다.

FAQ

**내가 암호로 메모리 ZIP를 보호할 수 있습니까?*Aspose.ZIP는 암호화된 ZIP 파일을 지원합니다. TraditionalEncryptionSettings 또는 AesEncryptionSettings 를 통해 ArchiveEntrySettings 통화할 때 입장에 따라 신청 CreateEntry.

** 내가 기억에 충전 한 기존 ZIP를 업데이트 할 수 있습니까?**예, 그것을 하나로 옮기십시오. Archive, 추가 또는 삭제 항목, 다음 Save 다시 흐름으로 돌아갑니다.

**이 작업은 Azure App 서비스 또는 컨테이너에서 작동합니까?**예. 메모리 및 스트리밍 지핑은 디스크 액세스가 제한된 모래 상자 환경에서 잘 작동합니다.

요약

당신은 Aspose.ZIP for .NET를 사용하여 **전체 메모리*에서 ZIP 아카이브를 만들고, 흐름에서 입력을 추가하고, 조정된 압축을 하였으며, 일시적인 파일없이 ASP.NET Core 끝점에서 파일을 반환했습니다.이 패턴을 사용하면 C# 응용 프로그램에서 다운로드, 패키지 및 수출을 효율적으로 생성합니다.

More in this category