Azure 中上传的 zip 文件包含无效内容,无法打开

Uploaded zip file in Azure contains invalid content and cannot be opened

我正在使用以下代码使用 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 cannot open the folder. The compressed (zipped) folder is invalid"。但是我的应用程序目录中保存的压缩文件可以很好地解压缩并包含我的 xml 文件。 我做错了什么?

我能够重现您遇到的问题。本质上,问题是当您启动上传命令时,内容没有完全写入 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);
        }