【问题标题】:Uploaded zip file in Azure contains invalid content and cannot be openedAzure 中上传的 zip 文件包含无效内容,无法打开
【发布时间】:2020-04-02 22:53:59
【问题描述】:

我正在使用以下代码通过 DotNetZip nuget 包将 XML 文件上传到 Azure Blob 存储帐户。

            XmlDocument doc = new XmlDocument();
            doc.Load(path);
            string xmlContent = doc.InnerXml;
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
            var cloudBlobClient = storageAccount.CreateCloudBlobClient();
            var cloudBlobContainer = cloudBlobClient.GetContainerReference(container);
            cloudBlobContainer.CreateIfNotExists();
            using (var fs = File.Create("test.zip"))
            {
                using (var s = new ZipOutputStream(fs))
                {
                    s.PutNextEntry("entry1.xml");
                    byte[] buffer = Encoding.ASCII.GetBytes(xmlContent);
                    s.Write(buffer, 0, buffer.Length);
                    fs.Position = 0;      
                    //Get the blob ref
                    var blob = cloudBlobContainer.GetBlockBlobReference("test.zip");          
                    blob.Properties.ContentEncoding = "zip"
                    blob.Properties.ContentType = "text/plain";
                    blob.Metadata["filename"] = "test.zip";
                    blob.UploadFromStream(fs);
                }
            }

此代码在我的容器中创建一个 zip 文件。但是当我下载它并尝试打开它时,我收到以下错误: “Windows 无法打开文件夹。压缩(压缩)文件夹无效”。但是我的应用程序目录中保存的压缩文件可以很好地解压缩并包含我的 xml 文件。 我做错了什么?

【问题讨论】:

  • 流需要刷新吗?文件流在这里似乎是多余的,但我认为它已经准备好进行测试了?
  • @BrendanGreen 我尝试刷新两个流,但没有运气。文件流在这里用于测试,但实际上我在那里使用 MemoryStream,因为 blob.UploadFromStream 函数由于某种原因不喜欢 ZipOutputStream。如果我直接传入 ZipOutputStream,我会得到一个空的 zip 文件。

标签: c# azure azure-blob-storage dotnetzip


【解决方案1】:

我能够重现您遇到的问题。本质上,问题是当您启动上传命令时,内容并未完全写入 zip 文件中。在我的测试中,本地磁盘上的 zip 文件大小为 902 字节,但在上传文件流时只有 40 字节,这就是问题所在。

我所做的是将两个功能分开,第一个功能只是创建文件和其他从文件读取并上传到存储中的功能。这是我使用的代码:

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse("UseDevelopmentStorage=true");
        var cloudBlobClient = storageAccount.CreateCloudBlobClient();
        var cloudBlobContainer = cloudBlobClient.GetContainerReference("test");
        cloudBlobContainer.CreateIfNotExists();
        using (var fs = File.Create("test.zip"))
        {
            using (var s = new ZipOutputStream(fs))
            {
                s.PutNextEntry("entry1.xml");
                byte[] buffer = File.ReadAllBytes(@"Path\To\MyFile.txt");
                s.Write(buffer, 0, buffer.Length);
                //Get the blob ref
            }
        }
        using (var fs = File.OpenRead("test.zip"))
        {
            var blob = cloudBlobContainer.GetBlockBlobReference("test.zip");
            blob.Properties.ContentEncoding = "zip";
            blob.Properties.ContentType = "text/plain";
            blob.Metadata["filename"] = "test.zip";
            fs.Position = 0;
            blob.UploadFromStream(fs);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2016-06-17
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多