无法上传 brotli 预压缩的 Json
Posted
技术标签:
【中文标题】无法上传 brotli 预压缩的 Json【英文标题】:Unable to upload brotli precompressed Json 【发布时间】:2021-09-15 19:49:24 【问题描述】:我对 c# 流了解甚少。我正在尝试将 brotli 压缩的 json 上传到 azure 存储中。
private async Task UploadJSONAsync(BlobClient blob, object serializeObject, CancellationToken cancellationToken)
var json = JsonConvert.SerializeObject(serializeObject);
using (var sourceStream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
using (var destStream = new MemoryStream())
using (var brotliStreamCompressor = new BrotliStream(destStream, CompressionLevel.Optimal, false))
sourceStream.CopyTo(brotliStreamCompressor);
//brotliStreamCompressor.Close(); // Closes the stream, can't read from a closed stream.
await blob.DeleteIfExistsAsync();
await blob.UploadAsync(destStream, cancellationToken);
//brotliStreamCompressor.Close(); // destStream has zero bytes
我确信我缺乏流知识会阻止它工作。
【问题讨论】:
您是否遇到了错误,如果是,是什么以及在哪里? @MickyD 你没看到代码中的 cmets 吗? 我能看到的只是注释掉代码 【参考方案1】:为了读取流,我必须将其位置设置回零。
private async Task UploadJSONAsync(BlobClient blob, object serializeObject, CancellationToken cancellationToken)
var json = JsonConvert.SerializeObject(serializeObject);
using (var sourceStream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
using (var destStream = new MemoryStream())
using (var brotliStreamCompressor = new BrotliStream(destStream, CompressionLevel.Optimal, false))
sourceStream.CopyTo(brotliStreamCompressor);
brotliStreamCompressor.Close();
destStream.Position = 0;
await blob.DeleteIfExistsAsync();
await blob.UploadAsync(destStream, cancellationToken);
【讨论】:
你真的不需要await blob.DeleteIfExistsAsync();
。这是一个额外的网络调用。 blob.UploadAsync()
将自动覆盖现有的 blob,如果不存在则创建一个新的 blob。
@GauravMantri Documentation 否则,这是我的经验:UploadAsync(Stream, CancellationToken) 操作创建一个新的块 blob,如果 blob 已经存在则抛出。。
对不起,我的错!您可以使用BlockBlobClient
代替BlobClient
。来自Documentation
:UploadAsync(Stream, BlobUploadOptions, CancellationToken) 操作会覆盖 blob 的内容,如果不存在则创建一个新的块 blob。
@GauravMantri 没有 CancellationToken 的相同方法(如我刚才所见)也会覆盖。是的不一致!以上是关于无法上传 brotli 预压缩的 Json的主要内容,如果未能解决你的问题,请参考以下文章