生成的带有 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 stream 的 File
方法也有重载。这样,您可以在保持内存流打开的同时使用 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");
我正在尝试从 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 stream 的 File
方法也有重载。这样,您可以在保持内存流打开的同时使用 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");