我尝试从 .NET Core 3.1 中的 Web API 下载多个文件,并将它们放入响应正文中写入的 zip 存档中。 当我使用浏览器下载 zip 文件时,zip 文件已损坏!
控制器:
public async Task DownloadFilesAsync([FromServices] IFileService fileService, [FromBody] IEnumerable<Guid> fileIds, Guid folderId)
{
HttpContext.Response.Headers.Add("Content-Disposition", $"{DispositionTypeNames.Attachment};filename*=files.zip");
HttpContext.Response.ContentType = MediaTypeNames.Application.Zip;
await fileService.GetZipAsync(User.UserId(), folderId, fileIds, HttpContext.Response.Body);
}
服务:
public async Task GetZipAsync(Guid userId, Guid folderId, IEnumerable<Guid> fileIds, Stream stream)
{
using (ZipArchive zip = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: true))
{
foreach (Guid id in fileIds)
{
// metadata stored in a sql database, File is a custom type
File file = await _fileRepository.GetFileAsync(folderId, id);
using Stream entry = zip.CreateEntry(file.Name, CompressionLevel.Optimal).Open();
await _fileStorage.WriteBlobAsync(userId, folderId, file.Name, entry);
}
}
}
存储库:
public async Task WriteBlobAsync(Guid userId, Guid folderId, string name, Stream output)
{
BlobContainerClient container = Client.GetBlobContainerClient(userId.ToString());
await container.GetBlobClient($"{folderId}/{name}").DownloadToAsync(output);
}
但下载的 zip 存档无法使用:
我做错了什么?
答案 0 :(得分:0)
好吧,我觉得自己在这个问题上有点愚蠢......
这段代码在背面非常好,我的问题出在客户端。
我的 axios 请求配置中缺少 { responseType: 'arraybuffer' }
...
答案 1 :(得分:-1)
方法一。
你可以尝试dispose ZipArchive
,错误应该可以解决。
public async Task GetZipAsync(Guid userId, Guid folderId, IEnumerable<Guid> fileIds, Stream stream)
{
using (ZipArchive zip = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: true))
{
foreach (Guid id in fileIds)
{
// metadata stored in a sql database, File is a custom type
File file = await _fileRepository.GetFileAsync(folderId, id);
using Stream entry = zip.CreateEntry(file.Name, CompressionLevel.Optimal).Open();
await _fileStorage.WriteBlobAsync(userId, folderId, file.Name, entry);
}
//I added this line
zip.Dispose();
}
}
方法二。
您可以将流的 AutoFlush 属性设置为 true。
更多详情,您可以参考以下链接。