c# - 为什么我的 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
。
解决方案
UploadAsync()
接受一个BlobUploadOptions
论点。尝试将其设置为这样的:
var opts = new BlobUploadOptions {
HttpHeaders = new BlobHttpHeaders {
ContentType = "text/csv;charset=utf-8", // or try utf-16 here
ContentEncoding = "gzip"
}
};
推荐阅读
- c++ - 如何将常量中的值设置为 struct c++
- c# - 如何反序列化复杂的嵌套 JSON?
- java - Jackson/Hibernate,元获取方法和序列化
- css - 如何添加背景图片
- mysql - 如何使用 redis 代替 MySQL 进行 Laravel Passport 令牌存储和身份验证
- apache-spark - 在 spark sql 中显示特定值
- sql - 从一组字符串列表中随机分配一个字符串
- java - Bean 名称“团队”的 BindingResult 和普通目标对象都不能用作请求属性
- javascript - 如何使用 css 和/或 javascript 动态更改样式
- c++ - 不能使用友好的 CRTP 类的私有构造函数