JavaScript/C# 膨胀和压缩通过 XHR 发送的数据

JavaScript/C# Inflate and deflate data sent through XHR

本文关键字:XHR 数据 膨胀 压缩 JavaScript      更新时间:2023-09-26

我必须在JavaScript中膨胀一些数据(实际上是csv文件块)客户端,并在C#的服务器端压缩它。

在客户端,我正在使用pako,它看起来像这样:

var fileReader = new FileReader();
fileReader.onload = function(progressEvent) {
    var arrayBuffer = this.result;
    var binData = new Uint8Array(arrayBuffer);
    var data = pako.deflate(binData);
    var dataBlob = new Blob(data, { "type": "application/zlib" });
    callback(dataBlob);
};
fileReader.readAsArrayBuffer(bytes);

它似乎运作良好。我说"似乎"是因为如果我保存在服务器端接收的数据,我会得到一个看起来像这样的字符串:

1201562201899117927731141602491...

我发现 ZLib 压缩数据应该以 0x78 和 0x9C 开头,120 是十进制的0x78,156 是十进制的0x9C,所以客户端膨胀似乎没问题。

问题出在服务器端,我无法压缩数据。这是我的代码的样子:

// Read past the first two bytes of the zlib header
inputStream.Seek(2, SeekOrigin.Begin);
using (var zipStream = new DeflateStream(inputStream, CompressionMode.Decompress))
using (FileStream fileStream = File.Create(filePath))
{
    zipStream.CopyTo(fileStream);
}

我从 DeflateStream 构造函数收到一个错误,说数据不太正确。

现在这是我到目前为止收集的内容:

  • 如果我在pako.deflate中添加一个{"to": "string" },它会返回一些二进制字符串而不是Uint8Array。它看起来很像我在给数据服务器端膨胀时得到的,所以这可能是 C# DeflateStream 所期望的。
  • 数据通过 XHR FormData 发送,它需要一个 Blob,它似乎总是将数据转换为十进制字符串。
  • 我使用 HttpContent.ReadAsStreamAsync() 读取服务器端的数据。

您认为我应该怎么做才能正确放气数据服务器端?

将数据传递给数组中的 blob 构造函数

var dataBlob = new Blob([data], { "type": "application/zlib" });

来自 MDN

语法

var aBlob = new Blob( array, options );

参数

  • array 是 ArrayBuffer、ArrayBufferView、Blob、DOMString 对象或任何此类对象的混合数组,这些对象将被放入 Blob 中。