当前位置: 首页 > 知识库问答 >
问题:

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

宰父德馨
2023-03-14

我有一个Azure函数,当一个blob被上传到某个目录时会被触发。它处理一个zip文件。当我用Azure storage explorer将文件上传到容器时,它工作得非常好。当我通过网络API上传它时,它爆炸了。如果我下载了这个文件,它似乎已经损坏,但是,它与源文件大小相同,当我在2个文件之间进行超越比较时,它看起来是相同的(超越比较似乎可以看到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个答案

沈成天
2023-03-14

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

 类似资料:
  • 我正在使用 Pyspark 尝试从 blob 存储中读取 zip 文件。我想在加载后解压缩文件,然后将解压缩的 CSV 写回 Blob 存储。 我正在遵循以下指南,该指南解释了一旦读取如何解压缩文件:https://docs.databricks.com/_static/notebooks/zip-files-python.html 但是它不能解释我是如何从blob中读取zip文件的。我有以下代码

  • 问题:从数据生成的包含csv文件的zip文件在上传到Azure Blob存储后似乎已损坏。 上传前的zip文件如下所示: 在上传过程中,我使用了Azure Storage Blob client library for Java(12.7.0版,但我也尝试了以前的版本)。这是我使用的代码(类似于SDK自述文件中提供的示例): 我得到了上传的文件: 当我直接从storage explorer下载文件

  • > 我正在向我的某个 Azure Api 管理 API 发送 POST 请求 在此帖子请求中,有一个 json 正文,其中包含 base64 编码的数据(zip 文件),如以下示例所示: {“foo”:“bar”,“data”:“your-base64-string”} 在API策略中,我想向Azure Storage REST API发送一个单独的请求,将上面提到的base64字符串保存为一个z

  • 问题内容: 在Web开发人员生命中的晚期或早期,您必须处理用户上传的文件和图像。 常见问题: 如何上载? 现代的Web浏览器和技术允许通过多种方式将用户提供的文件上传到我的服务器。什么是最佳做法,我必须考虑什么? 我该如何处理? 上传完成后,我需要了解什么安全性以及文件的进一步处理 如何储存和运送? 是否有关于如何存储上载文件的最佳实践? 免责声明:我已经在以下回答中投入了将近30分钟的时间,删除

  • 我为服务器制作了一个Minecraft资源包。我想制作它,这样我就可以将纹理和修改后的文件推送到存储库,而无需每次都更改下载链接。 所以,我来到GitHub就是为了实现这样的目标。所有的一切都准备好了。。。单击“克隆或下载”并单击ZIP时。ZIP文件包含项目名称和分支“PocketPixels_RPG-master”的文件夹。 这会破坏文件夹的结构并阻止。拉链可以在Minecraft中作为纹理包阅