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 构造函数中得到一个错误,说数据不太正确。
现在这是我到目前为止收集到的:
- 如果我将 { "to": "string" } 添加到 pako.deflate,它 returns 一些二进制字符串而不是 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。
我必须在 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 构造函数中得到一个错误,说数据不太正确。
现在这是我到目前为止收集到的:
- 如果我将 { "to": "string" } 添加到 pako.deflate,它 returns 一些二进制字符串而不是 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。