首页 > 解决方案 > 为什么我的 CSV 文件在上传到 Azure Blob 存储时会损坏?

问题描述

我的 Azure 函数创建一个 CSV 文件,对其进行 gzip 压缩,然后使用以下代码将其上传到 Azure Blob 存储:

var blobServiceClient = new BlobServiceClient("...");
var containerClient = blobServiceClient.GetBlobContainerClient("...");
var config = new CsvConfiguration(CultureInfo.CurrentCulture) { Delimiter = ";", Encoding = Encoding.UTF8 };

var list = new List<FakeModel>
{
   new FakeModel { Field1 = "A", Field2 = "B" },
   new FakeModel { Field1 = "C", Field2 = "D" }
};

var now = DateTime.Now;
var csvFileName = Path.Combine(Path.GetTempPath(), now.Hour + "_" + now.Minute + "_" + now.Second + ".csv");

using (var writer = new StreamWriter(csvFileName))
using (var csv = new CsvWriter(writer, config))
{
   await csv.WriteRecordsAsync(list);
   await csv.FlushAsync();
}

var gzFileName = csvFileName.Replace(".csv", ".csv.gz");

var bytes = await File.ReadAllBytesAsync(csvFileName);

using (var fs = new FileStream(gzFileName, FileMode.CreateNew))
using (var zipStream = new GZipStream(fs, CompressionMode.Compress, true))
{
   zipStream.Write(bytes, 0, bytes.Length);
   await zipStream.FlushAsync();

   fs.Position = 0;

   var blockBlob = containerClient.GetBlockBlobClient(gzFileName.Substring(csvFileName.LastIndexOf('\\') + 1));
   await blockBlob.UploadAsync(fs);
}

File.Delete(csvFileName);
File.Delete(gzFileName);

一切正常,*.gz文件上传到 Azure,但是当我从 Azure 下载它并使用 7z 在本地打开它以提取它时,7z 给我以下错误:

在此处输入图像描述

在本地,这两个文件创建正确,我可以同时打开*.csv一个*.csv.gz

标签: c#csvgzipazure-blob-storage7zip

解决方案


UploadAsync() 接受一个BlobUploadOptions论点。尝试将其设置为这样的:

var opts = new BlobUploadOptions {
    HttpHeaders = new BlobHttpHeaders {
        ContentType = "text/csv;charset=utf-8", // or try utf-16 here
        ContentEncoding = "gzip"
    }
};

推荐阅读