我想下载一个pdf文件axios并保存在磁盘上(服务器端)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!');
});
});文件已保存,但内容已损坏...
如何正确保存文件?
发布于 2020-04-17 18:30:38
实际上,我认为之前接受的答案有一些缺陷,因为它不能正确处理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(),呼叫then()在返回的promise上,并确保下载的文件已完成处理。
或者,如果您使用更新版本的NodeJS,您可以尝试执行以下操作:
import * as stream from 'stream';
import { promisify } from 'util';
const finished = promisify(stream.finished);
export async function downloadFile(fileUrl: string, outputLocationPath: string): Promise {
const writer = createWriteStream(outputLocationPath);
return Axios({
method: 'get',
url: fileUrl,
responseType: 'stream',
}).then(async response => {
response.data.pipe(writer);
return finished(writer); //this is a Promise
});
}发布于 2019-03-27 18:51:01
您可以简单地使用response.data.pipe和fs.createWriteStream通过管道将响应发送到文件
axios({
method: "get",
url: "https://xxx/my.pdf",
responseType: "stream"
}).then(function (response) {
response.data.pipe(fs.createWriteStream("/temp/my.pdf"));
});发布于 2019-09-05 21:04:29
// This works perfectly well!
const axios = require('axios');
axios.get('http://www.sclance.com/pngs/png-file-download/png_file_download_1057991.png', {responseType: "stream"} )
.then(response => {
// Saving file to working directory
response.data.pipe(fs.createWriteStream("todays_picture.png"));
})
.catch(error => {
console.log(error);
});https://stackoverflow.com/questions/55374755
复制相似问题