无法上传 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。来自DocumentationUploadAsync(Stream, BlobUploadOptions, CancellationToken) 操作会覆盖 blob 的内容,如果不存在则创建一个新的块 blob。 @GauravMantri 没有 CancellationToken 的相同方法(如我刚才所见)也会覆盖。是的不一致!

以上是关于无法上传 brotli 预压缩的 Json的主要内容,如果未能解决你的问题,请参考以下文章

IIS 上的 Blazor Webassembly Brotli 和 Gzip 压缩

nginx编译添加brotli模块对wasm压缩的支持

brotli压缩

python解压br格式文件brotli安装使用

使用 brotli 压缩文件和目录列表

启用 Brotli 压缩算法,对比 Gzip 压缩 CDN 流量再减少 20%