gpt4 book ai didi

javascript - node.js axios下载文件流和writeFile

转载 作者:行者123 更新时间:2023-11-30 06:58:12 53 4
gpt4 key购买 nike

我想用 axios 下载一个 pdf 文件并用 fs.writeFile 保存在磁盘(服务器端),我试过:

axios.get('https://xxx/my.pdf', {responseType: 'blob'}).then(response => {
fs.writeFile('/temp/my.pdf', response.data, (err) => {
if (err) throw err;
console.log('The file has been saved!');
});
});

文件已保存,但内容已损坏...

如何正确保存文件?

最佳答案

实际上,我认为之前接受的答案有一些缺陷,因为它不能正确处理 writestream,所以如果你在 Axios 给你响应后调用“then()”,你最终会得到一个部分下载的文件.

当下载稍大的文件时,这是一个更合适的解决方案:

export async function downloadFile(fileUrl: string, outputLocationPath: string) {
const writer = createWriteStream(outputLocationPath);

return Axios({
method: 'get',
url: fileUrl,
responseType: 'stream',
}).then(response => {

//ensure that the user can call `then()` only when the file has
//been downloaded entirely.

return new Promise((resolve, reject) => {
response.data.pipe(writer);
let error = null;
writer.on('error', err => {
error = err;
writer.close();
reject(err);
});
writer.on('close', () => {
if (!error) {
resolve(true);
}
//no need to call the reject here, as it will have been called in the
//'error' stream;
});
});
});
}

这样,您可以调用 downloadFile(),在返回的 promise 上调用 then(),并确保下载的文件已完成处理。

或者,如果您使用更现代的 NodeJS 版本,您可以试试这个:

import * as stream from 'stream';
import { promisify } from 'util';

const finished = promisify(stream.finished);

export async function downloadFile(fileUrl: string, outputLocationPath: string): Promise<any> {
const writer = createWriteStream(outputLocationPath);
return Axios({
method: 'get',
url: fileUrl,
responseType: 'stream',
}).then(response => {
response.data.pipe(writer);
return finished(writer); //this is a Promise
});
}

关于javascript - node.js axios下载文件流和writeFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55374755/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com