在 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 文件,并且能够在实际项目中灵活运用。