实际上,我认为之前被接受的答案有些缺陷,因为它无法正确处理写入流,所以如果你在Axios给出响应后调用"then()",你最终会得到一个部分下载的文件。
在下载稍大的文件时,以下是一种更合适的解决方案:
export async function downloadFile(fileUrl: string, outputLocationPath: string) {
const writer = createWriteStream(outputLocationPath);
return Axios({
method: 'get',
url: fileUrl,
responseType: 'stream',
}).then(response => {
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);
}
});
});
});
}
这样,您可以调用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);
});
}