发送 ArrayBuffer 或 Blob 并重建它们的正确方法是什么?

cod*_*ero 5 blob node.js express angular angular-httpclient

在将数据发送到客户端之前,我已经阅读了十几篇关于如何在ArrayBuffertoBlob或 to之间转换的帖子Uint8Array......但我似乎根本无法让它工作。Blob当我确实获取数据时,在将其输出到文件之前,我无法将它们重建回来。

const Blob = require('cross-blob');
const randomBytes = require('randombytes');

const buffer = randomBytes(1024); // Supposed to give me Buffer
Run Code Online (Sandbox Code Playgroud)

以下是我尝试过的东西......

data = buffer;
Run Code Online (Sandbox Code Playgroud)

^ 给我<Buffer 11 22 33 ...>

data = Uint8Array.from(buffer); 
Run Code Online (Sandbox Code Playgroud)

^ 给了我一个整数数组,这看起来最有前途?但是当到达客户端时,它变成了一个带有索引和字节值的对象......

data = Uint8Array.from(buffer).buffer;
Run Code Online (Sandbox Code Playgroud)

^ 给出ArrayBuffer { byteLength: 1024},当检查时它显示size: 2并且type: 'text/plain'......

data = new Blob(buffer, { type: 'application/octet-stream' });
data = new Blob([new Uint8Array(buffer, buffer.byteOffset, buffer.length)], { type: 'application/octet-stream' });
data = new Blob([Uint8Array.from(buffer)], { type: 'application/octet-stream' });
Run Code Online (Sandbox Code Playgroud)

^ 所有这些,当到达客户端时也带有size: 2type: 'text/plain'...

在服务器端,我正在运行 Express:

router.get('/test/*', function(req, res, next) {
  ...
  let data = myFunctionThatGeneratesData();
  res.send(data);
});
Run Code Online (Sandbox Code Playgroud)

在客户端,我像这样请求(Angular/TypeScript):

this.http.get('/test/random-bytes-array', {
  responseType: 'blob'  // also tried 'arraybuffer'
}).subscribe(data => {
  debugger;
  console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

我一定做错了什么......我试图发送多个二进制数据块,或者作为ArrayBuffer,Uint8ArrayBlob(无论有效),当到达另一端时,将它们组合回Blob.

Pat*_*rts 3

在 Node.js 中,crypto.randomBytes返回一个Buffer. 这是用于向客户端发送原始数据的正确类型。

使用 Express 时,使用 来设置响应的正确内容类型非常重要res.type()。但是,在发送 时Buffer,如果在任何其他中间件中未设置 content-type 标头,则express将application/octet-stream默认使用.

当参数是 Buffer 对象时,该方法将 Content-Type 响应头字段设置为“application/octet-stream”,除非之前定义。

router.get('/test/*', function(req, res, next) {
  ...
  let data = myFunctionThatGeneratesData();
  res.type('application/octet-stream').send(data);
  // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ might not be necessary
});
Run Code Online (Sandbox Code Playgroud)

最后,在 Angular 中,使用responseType: 'blob'是正确的:

this.http.get('/test/random-bytes-array', {
  responseType: 'blob'
}).subscribe(data => {
  console.log(data);
});
Run Code Online (Sandbox Code Playgroud)