从 URL 中获取 blob 并写入文件
Fetch blob from URL and write to file
我正在尝试 fetch
来自服务器的一些二进制数据 (MP3),然后将其存储在文件中:
var fs = require ('fs');
var fetch = require ('node-fetch');
fetch (
audioUrl,
{
method: 'GET',
headers: { 'Accept': '*/*' }
}
)
.then ((res) => res.blob())
.then ((blob) => {
console.log ('Blob size: ', blob.size);
fs.writeFile (
`filename.mp3`,
blob, // BUG HERE
(err) => {
if (err) {
console.log (`Error writing audio ${audioIdx}`, err);
}
}
);
})
问题标记在 BUG HERE
。我将一个 blob 传递给 fs
,它不理解 blob,只是写 [object Blob]
。我还尝试了以下方法:
blob // writes [object Blob]
new Uint8Array (blob) // writes empty file
Buffer.from (new Uint8Array (blob)) // writes empty file
new Buffer (blob, 'binary') // Error: argument is not a Buffer
None 以上作品。如何正确执行此操作?
请注意,我在调用 writeFile
之前记录了 blob.size
。 blob.size
显示了正确的大小,因此 fetch
似乎是成功的。
好的,所以从 MDN Docs 来看,Blob 不是缓冲区,而这是写入文件系统所需要的。
我认为您最好只从响应中获取缓冲区,例如:
.then(res => res.buffer())
.then(/* write your file here */)
虽然取决于文件的大小,但您最好的选择可能是完全跳过 .writeFile
函数并转而使用管道流。
您可以使用 fs.createWriteStream
将响应流式传输到文件。
fetch(
audioUrl,
{
method: 'GET',
headers: { 'Accept': '*/*' }
}
).then(res => {
new Promise((resolve, reject) => {
const dest = fs.createWriteStream(`filename.mp3`);
res.body.pipe(dest);
res.body.on('end', () => resolve());
dest.on('error', reject);
})
});
简单有效(在 nodejs 中使用 Buffer API)
const fetch = require('node-fetch');
const Buffer = require('buffer').Buffer
const fs = require('fs');
fetch("https://example.com/file.mp3", {
"headers": {},
"method": "GET"
}).then(function(resp) {
return resp.blob();
}).then(async function(blob) {
var buffer = await blob.arrayBuffer();
buffer = Buffer.from(buffer)
fs.createWriteStream('file.mp3').write(buffer);
})
我正在尝试 fetch
来自服务器的一些二进制数据 (MP3),然后将其存储在文件中:
var fs = require ('fs');
var fetch = require ('node-fetch');
fetch (
audioUrl,
{
method: 'GET',
headers: { 'Accept': '*/*' }
}
)
.then ((res) => res.blob())
.then ((blob) => {
console.log ('Blob size: ', blob.size);
fs.writeFile (
`filename.mp3`,
blob, // BUG HERE
(err) => {
if (err) {
console.log (`Error writing audio ${audioIdx}`, err);
}
}
);
})
问题标记在 BUG HERE
。我将一个 blob 传递给 fs
,它不理解 blob,只是写 [object Blob]
。我还尝试了以下方法:
blob // writes [object Blob]
new Uint8Array (blob) // writes empty file
Buffer.from (new Uint8Array (blob)) // writes empty file
new Buffer (blob, 'binary') // Error: argument is not a Buffer
None 以上作品。如何正确执行此操作?
请注意,我在调用 writeFile
之前记录了 blob.size
。 blob.size
显示了正确的大小,因此 fetch
似乎是成功的。
好的,所以从 MDN Docs 来看,Blob 不是缓冲区,而这是写入文件系统所需要的。
我认为您最好只从响应中获取缓冲区,例如:
.then(res => res.buffer())
.then(/* write your file here */)
虽然取决于文件的大小,但您最好的选择可能是完全跳过 .writeFile
函数并转而使用管道流。
您可以使用 fs.createWriteStream
将响应流式传输到文件。
fetch(
audioUrl,
{
method: 'GET',
headers: { 'Accept': '*/*' }
}
).then(res => {
new Promise((resolve, reject) => {
const dest = fs.createWriteStream(`filename.mp3`);
res.body.pipe(dest);
res.body.on('end', () => resolve());
dest.on('error', reject);
})
});
简单有效(在 nodejs 中使用 Buffer API)
const fetch = require('node-fetch');
const Buffer = require('buffer').Buffer
const fs = require('fs');
fetch("https://example.com/file.mp3", {
"headers": {},
"method": "GET"
}).then(function(resp) {
return resp.blob();
}).then(async function(blob) {
var buffer = await blob.arrayBuffer();
buffer = Buffer.from(buffer)
fs.createWriteStream('file.mp3').write(buffer);
})