ASP.NET Core 中生成 ZIP 压缩包的实战指南

开发 前端
如果你在返回文件结果之前删除了 ZIP 文件,那么用户将无法下载该文件。因此,通常的做法是在用户下载完文件后再删除它,或者在某个定时任务中清理旧的 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 文件,并且能够在实际项目中灵活运用。

责任编辑:武晓燕 来源: 程序员编程日记
相关推荐

2021-03-18 07:33:54

PDF DinkToPdfC++

2024-06-11 09:00:00

异步编程代码

2024-09-09 07:37:51

AspJWT权限

2024-09-10 08:13:16

Asp项目轻量级

2024-09-10 08:15:33

Asp项目API

2021-02-19 06:54:33

配置系统ASP.NET Cor

2018-08-20 08:03:46

跨平台 Web操作系统

2021-03-04 11:10:29

容器化Docker虚拟机

2023-06-19 07:31:52

压缩包java.Http

2021-03-12 00:04:52

网关Api

2009-08-27 16:59:20

ASP.NET用户控件

2021-01-05 07:51:06

版本化ASP

2021-11-01 14:52:38

ElasticSear索引SQL

2023-07-04 08:26:15

2021-03-17 09:45:31

LazyCacheWindows

2021-02-02 16:19:08

Serilog日志框架

2021-02-06 21:40:13

SignalR通讯TypeScript

2021-02-28 20:56:37

NCache缓存框架

2021-01-07 07:39:07

工具接口 Swagger

2021-03-03 22:37:16

MediatR中介者模式
点赞
收藏

51CTO技术栈公众号