C# Azure中上载的zip文件包含无效内容,无法打开
我使用以下代码使用DotNetZip nuget包将XML文件上载到Azure Blob存储帐户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
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文件。