微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

在将数据发送到客户端之前,我已经阅读了十几篇关于如何在 ArrayBufferBlobUint8Array 等之间转换的帖子......但我可以似乎根本无法让它发挥作用。当我确实通过数据时,我无法在将其输出文件之前将它们重建为 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: 2type: '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: 2type: '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);
});

我一定是做错了什么......我正在尝试发送多个二进制数据块,无论是作为 ArrayBufferUint8Array 还是 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);
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?