Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure中上载的zip文件包含无效内容,无法打开_C#_Azure_Azure Blob Storage_Dotnetzip - Fatal编程技术网

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

C# Azure中上载的zip文件包含无效内容,无法打开,c#,azure,azure-blob-storage,dotnetzip,C#,Azure,Azure Blob Storage,Dotnetzip,我使用以下代码使用DotNetZip nuget包将XML文件上载到Azure Blob存储帐户 XmlDocument doc = new XmlDocument(); doc.Load(path); string xmlContent = doc.InnerXml; CloudStorageAccount storageAccount = CloudStorageAccount.Parse(con

我使用以下代码使用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文件。
我做错了什么?

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

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

水流需要冲洗吗?文件流在这里似乎是多余的,但我认为它是用于测试的吗?@BrendanGreen我尝试刷新两个流,但没有成功。这里的filestream用于测试,但实际上我使用的是MemoryStream,因为出于某种原因,
blob.UploadFromStream
函数不喜欢ZipoutStream。如果我直接传入ZipoutStream,我会得到一个空的zip文件。需要刷新流吗?文件流在这里似乎是多余的,但我认为它是用于测试的吗?@BrendanGreen我尝试刷新两个流,但没有成功。这里的filestream用于测试,但实际上我使用的是MemoryStream,因为出于某种原因,
blob.UploadFromStream
函数不喜欢ZipoutStream。如果直接传入ZipOutputStream,我会得到一个空的zip文件。