在Azure Blob存储中处理上载的Zip文件

时间:2020-07-20 21:14:26

标签: c# azure azure-storage-blobs

我有一个Azure函数,当将Blob上传到某个目录时会触发该函数。它处理一个zip文件。当我使用Azure存储资源管理器将文件上传到容器时,它可以完美运行。当我通过Web API上传它时,它炸毁了。但是,如果我下载该文件似乎已损坏,那么它与源文件的大小是相同的,并且当我在两个文件之间进行超越比较时,看起来是相同的(并且超越比较似乎可以看到zip的内容)文件)。

这是上传代码:

public async Task<UploadedFileDescription> StoreCatalog(HttpRequestMessage Request)
{
    UploadedFileDescription upload = new UploadedFileDescription();  // my return description
    var guidString = Guid.NewGuid().ToString();
    string fileName = guidString + ".zip";  //add the .zip extenstion
    upload.fileName = fileName;
    string storageConnection = CloudConfigurationManager.GetSetting("StorageConnectionString");
    CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(storageConnection);
    CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
    CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference("uploadedzips");
    CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(fileName);
    cloudBlockBlob.Properties.ContentType = "application/x-zip-compressed";
    var stream = await Request.Content.ReadAsStreamAsync();
    cloudBlockBlob.UploadFromStream(stream);
    return upload;
}

文件可以很好地进入Blob存储。

然后触发的Azure函数在此行触发并爆炸:

ZipArchive archive = new ZipArchive(myBlob);
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(destinationStorage);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(destinationContainer);

var catalogService = Helpers.container.Resolve<ICatalogService>();
foreach (ZipArchiveEntry file in archive.Entries)    <------blows up here with the msg
System.IO.InvalidDataException
  HResult=0x80131501
  Message=Number of entries expected in End Of Central Directory does not correspond to number of entries in Central Directory.
  Source=System.IO.Compression
  StackTrace:
   at System.IO.Compression.ZipArchive.ReadCentralDirectory()
   at System.IO.Compression.ZipArchive.get_Entries()
   at DentaCAD.AzureFunctions.ProcessUploadedZip.Run(Stream myBlob, String name, TraceWriter log) in C:\repo\ProcessUploadedZip.cs:line 35
   at Microsoft.Azure.WebJobs.Host.Executors.VoidMethodInvoker`2.InvokeAsync(TReflected instance, Object[] arguments)
   at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`2.<InvokeAsync>d__9.MoveNext()

在手动上传文件时碰到该行时,存档中有163个条目(所有小的jpg文件)

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这可能是错误的MIME类型的问题。 尝试将内容类型更改为"application/zip"而不是"application/x-zip-compressed"