从 Azure blob 存储下载多个文件作为 zip 文件

时间:2021-05-22 10:37:36

标签: c# asp.net-core-webapi azure-blob-storage

我尝试从 .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 存档无法使用:

Zip archive content

我做错了什么?

2 个答案:

答案 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。

更多详情,您可以参考以下链接。

ZipArchive gives Unexpected end of data corrupted error

相关问题