ASP.NET Core 中生成 ZIP 壓縮包的實戰指南
在 ASP.NET Core 開發中,有時候我們需要將一組文件打包成一個 ZIP 文件,然后提供給用戶下載。這種需求在文件共享、數據備份或生成報告等場景中尤為常見。今天,我們就來聊聊如何在 ASP.NET Core 中生成 ZIP 壓縮包,并且保證整個過程既簡單又高效。
準備工作
在開始之前,你需要確保你的 ASP.NET Core 項目已經搭建完畢,并且你有一個或多個需要打包的文件。另外,為了生成 ZIP 文件,我們將使用 .NET 提供的 System.IO.Compression 和 System.IO.Compression.FileSystem 命名空間下的類。
第一步:添加必要的引用
在 ASP.NET Core 項目中,System.IO.Compression 和 System.IO.Compression.FileSystem 通常是默認包含的,但為了確保萬無一失,你可以在項目文件(.csproj)中檢查或添加以下引用:
<ItemGroup>
<PackageReference Include="System.IO.Compression" Version="4.3.0" />
<PackageReference Include="System.IO.Compression.FileSystem" Version="4.3.0" />
</ItemGroup>
不過,對于大多數 ASP.NET Core 項目來說,這些包已經是隱式包含的了,因此你可能不需要手動添加。
第二步:創建 ZIP 文件
接下來,我們需要編寫一個方法來生成 ZIP 文件。這個方法將接受一個包含要打包文件的路徑的列表,以及一個用于保存 ZIP 文件的輸出路徑。
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
public class ZipHelper
{
public void CreateZipFile(List<string> filePaths, string zipFilePath)
{
using (FileStream zipStream = new FileStream(zipFilePath, FileMode.Create))
{
using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Create))
{
foreach (var filePath in filePaths)
{
string entryName = Path.GetFileName(filePath); // 可以根據需要修改文件名或路徑
ZipArchiveEntry entry = archive.CreateEntry(entryName);
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
using (Stream entryStream = entry.Open())
{
fileStream.CopyTo(entryStream);
}
}
}
}
}
}
}
在這個方法中,我們首先創建一個指向 ZIP 文件的 FileStream,然后在這個流上創建一個 ZipArchive。對于每個要打包的文件,我們創建一個 ZipArchiveEntry,并將文件內容復制到該條目中。
第三步:在控制器中調用
現在,我們可以在 ASP.NET Core 控制器中調用這個方法,并將生成的 ZIP 文件提供給用戶下載。
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.IO;
public class FileDownloadController : Controller
{
private readonly ZipHelper _zipHelper;
public FileDownloadController(ZipHelper zipHelper)
{
_zipHelper = zipHelper;
}
[HttpGet("download-zip")]
public IActionResult DownloadZip()
{
List<string> filePaths = new List<string>
{
Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "files", "file1.txt"),
Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "files", "file2.jpg")
// 添加更多文件路徑
};
string zipFilePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "files", "download.zip");
_zipHelper.CreateZipFile(filePaths, zipFilePath);
byte[] zipFileBytes = System.IO.File.ReadAllBytes(zipFilePath);
string contentType = "application/zip";
string fileName = "download.zip";
return File(zipFileBytes, contentType, fileName);
}
}
在這個控制器中,我們定義了一個 DownloadZip 方法,它接受一個 HTTP GET 請求。在這個方法中,我們指定了要打包的文件路徑列表,并調用 ZipHelper 的 CreateZipFile 方法來生成 ZIP 文件。然后,我們讀取 ZIP 文件的內容,并將其作為文件結果返回給用戶。
第四步:清理工作(可選)
在實際應用中,你可能不希望每次生成 ZIP 文件后都將其保留在服務器上。因此,你可以在返回文件結果后刪除 ZIP 文件。
// 在返回 File 結果之前或之后刪除 ZIP 文件
System.IO.File.Delete(zipFilePath);
但是,請注意,如果你在返回文件結果之前刪除了 ZIP 文件,那么用戶將無法下載該文件。因此,通常的做法是在用戶下載完文件后再刪除它,或者在某個定時任務中清理舊的 ZIP 文件。
總結
通過上面的步驟,我們已經在 ASP.NET Core 中成功生成了一個 ZIP 壓縮包,并將其提供給了用戶下載。這個過程既簡單又高效,并且可以根據你的需求進行自定義。希望這篇文章能幫助你更好地理解如何在 ASP.NET Core 中生成 ZIP 文件,并且能夠在實際項目中靈活運用。