问题描述
在将数据发送到客户端之前,我已经阅读了十几篇关于如何在 ArrayBuffer
到 Blob
或 Uint8Array
等之间转换的帖子......但我可以似乎根本无法让它发挥作用。当我确实通过数据时,我无法在将其输出到文件之前将它们重建为 Blob
。
const Blob = require('cross-blob');
const randomBytes = require('randombytes');
const buffer = randomBytes(1024); // Supposed to give me Buffer
以下是我尝试过的东西...
data = buffer;
^ 给我 <Buffer 11 22 33 ...>
data = Uint8Array.from(buffer);
^ 给了我一个整数数组,这看起来最有前途?但是当到达客户端时,它变成了一个带有索引和字节值的对象......
data = Uint8Array.from(buffer).buffer;
^ 给出 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' });
^ 所有这些,当到达客户端时还带有 size: 2
和 type: 'text/plain'
...
在服务器端,我运行的是 Express:
router.get('/test/*',function(req,res,next) {
...
let data = myFunctionThatGeneratesData();
res.send(data);
});
在客户端,我是这样请求的(Angular/TypeScript):
this.http.get('/test/random-bytes-array',{
responseType: 'blob' // also tried 'arraybuffer'
}).subscribe(data => {
debugger;
console.log(data);
});
我一定是做错了什么......我正在尝试发送多个二进制数据块,无论是作为 ArrayBuffer
、Uint8Array
还是 Blob
(无论有效)以及何时到达另一端,将它们组合回 Blob
。
解决方法
在 Node.js 中,crypto.randomBytes
返回一个 Buffer
。这是用于向客户端发送原始数据的正确类型。
使用 Express 时,务必使用 res.type()
设置正确的响应内容类型。但是,在发送 Buffer
时,如果没有在任何其他中间件中设置 content-type 标头,则 express will use application/octet-stream
by default。
当参数为 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
});
最后在 Angular 中,使用 responseType: 'blob'
是正确的:
this.http.get('/test/random-bytes-array',{
responseType: 'blob'
}).subscribe(data => {
console.log(data);
});