JavaScript/C# 对通过 XHR 发送的数据进行膨胀和收缩

JavaScript/C# Inflate and deflate data sent through XHR

我必须在 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);

它似乎运作良好。我说 "seem" 是因为如果我保存在服务器端收到的数据,我会得到一个如下所示的字符串:

1201562201899117927731141602491...

found out 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 构造函数中得到一个错误,说数据不太正确。

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

你认为我应该怎样做才能正确地压缩数据服务器端?

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

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

来自 MDN

语法

var aBlob = new Blob( array, options );

参数

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