生成的带有 Asp.NET 核心的 zip 文件给出错误存档意外结束

Generated zip file with Asp.NET Core gives error Unexpected end of archive

我正在尝试从 SQL 数据库中存储为字节数组的文件生成 zip 文件。我正在使用此代码:

public async Task<IActionResult> Download(int id)
{
    var files = this.assignmentsService.GetFilesForAssignment(id).ToList();

    using var memoryStream = new MemoryStream();
    using var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true);

    foreach (var file in files)
    {
        var zipFile = archive.CreateEntry(file.Name);
        using var streamWriter = new StreamWriter(zipFile.Open());
        streamWriter.Write(file.Content);
    }

    return this.File(memoryStream.ToArray(), "application/zip", "Description.zip");
}

当我运行它时,文件下载成功,所有文件都在存档中。但是当我尝试打开其中一个时,出现以下错误:

C:\Users\User\Downloads\Description.zip: Unexpected end of archive

您应该dispose ZipArchive 以确保它完成对目标流的写入。您可以通过将 ZipArchive 包装在 using 块中而不是在此处使用 using 声明来做到这一点:

using var memoryStream = new MemoryStream();
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
    foreach (var file in files)
    {
        var zipFile = archive.CreateEntry(file.Name);
        using var streamWriter = new StreamWriter(zipFile.Open());
        streamWriter.Write(file.Content);
    }
}

return this.File(memoryStream.ToArray(), "application/zip", "Description.zip");

请注意 directly takes a streamFile 方法也有重载。这样,您可以在保持内存流打开的同时使用 ZipArchive 的 using 声明(File() 调用最终将在将流写入 HTTP 响应后对其进行处理):

var memoryStream = new MemoryStream();
using var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true);

foreach (var file in files)
{
    var zipFile = archive.CreateEntry(file.Name);
    using var streamWriter = new StreamWriter(zipFile.Open());
    streamWriter.Write(file.Content);
}

return File(memoryStream, "application/zip", "Description.zip");