如何在 NodeJS 或 AngularJS 中将字节数组转换为文件

How to transform an array of bytes into a file in NodeJS or AngularJS

第三方 API 以 字节数组 的形式向我发送了一个文件,例如

(244511) [37, 80, 68, 70, 45, 49, 46, 52, 13, 10, 37, 226, 227, 207, 211, 13, 10, 49, 32, 48, 32, 111, 98, 106, 13, 10, 60, 60, 13, 10, 47, 84, 105, 116, 108, 101, 32, 60, 70, 69, 70, 70, 48, 48, 52, 69, 48, 48, 55, 53, 48, 48, 54, 70, 48, 48, 55, 54, 48, 48, 54, 70, 48, 48, 50, 48, 48, 48, 53, 50, 48, 48, 54, 49, 48, 48, 55, 48, 48, 48, 55, 48, 48, 48, 54, 70, 48, 48, 55, 50, 48, 48, 55, 52, 48, 48, 54, 70, 62, 13, …]

我知道文件的原始名称(包括扩展名)但不知道 mime 类型。

我的后端 (NodeJS) 目前这样做:

const data = JSON.parse(res.body).result[0] // 'data' is the byte array above
res.writeHead(200, { 'Content-Type': 'application/json' })
res.end({ data })

我的 前端 (AngularJS 1.x) 这样做:

var data = rsp.data
var blob = new $window.Blob([data], {type: 'application/pdf;charset=utf-8'})
$window.saveAs(blob, filename)

(我在几分钟前添加的 application/pdf 部分是为了看它是否至少适用于 PDF 文件……它不适用)

我真的不知道我应该怎么做才能将该数组转换为可以正确打开的文件,我已经尝试了我在网上找到的所有方法,但都无济于事。文件已保存,但打开后无法使用。

我什至不知道我是否必须更改前端或后端,或两者都更改。

任何帮助将不胜感激。

解决方案是首先在前端将字节数组转换为 Uint8Array。 此外,显然不需要在创建 blob 时指定 mime 类型,这非常方便。

var bytes = new Uint8Array(rsp.data)
var blob = new $window.Blob([bytes])
$window.saveAs(blob, filename)