【发布时间】:2021-01-14 12:57:36
【问题描述】:
我正在尝试使用 ZipArchive 压缩我的 blob 存储文件并将该 zip 流上传回 blob 存储。
以下是将文件流下载到 Zip 条目并上传回 blob 存储的代码,但问题是当我返回存储资源管理器并下载我的 zip 文件时,它给了我这个错误:
存档格式未知或已损坏
var account = _cloudStorageAccount;
var blobClient = account.CreateCloudBlobClient();
CloudBlobContainer container = _blobClient.GetContainerReference("myFiles");
CloudBlockBlob cloudBlockBlob = container.GetBlockBlobReference("myFile.pdf");
MemoryStream zipStream = new MemoryStream();
using (var zip = new ZipArchive(zipStream, ZipArchiveMode.Create , true))
{
ZipArchiveEntry orderEntry = zip.CreateEntry("myFile.pdf");
using (Stream entryStream = orderEntry.Open())
{
var cloudBlockClient = container.GetBlockBlobReference("myFile.pdf");
await cloudBlockClient.DownloadToStreamAsync(entryStream);
}
CloudBlobContainer _blobContainer = _blobClient.GetContainerReference("protocol");
CloudBlockBlob cloudBlockBlobZip = _blobContainer.GetBlockBlobReference("Fifth.zip");
cloudBlockBlobZip.Properties.ContentType = "zip";
zipStream.Seek(0, SeekOrigin.Begin);
zipStream.Position = 0;
await cloudBlockBlobZip.UploadFromStreamAsync(zipStream);
var fileUrl = cloudBlockBlobZip.Uri.AbsoluteUri;
return zipStream;
}
【问题讨论】:
-
嗯,您可以尝试代替 DownloadToStreamAsync 开始下载(返回一个 Stream),然后在流上使用 CopyAsync 将其复制到 entryStream。
-
我使用了 BeginDownloadToStream 但在 AsyncCallback 中给我输出,所以在回调中我无法将流设置为 zip 条目。
-
那不是正确的,那是老式异步。您使用的是较新的 Azure.Storage.Blobs 库还是较旧的库?