File Streams Wtih Axios



我需要使用 Axios 从流中下载文件。我不认为这是服务器的问题,因为如果我使用http包,它可以工作。这是我的代码:

export function downloadRequest (savePath, reqURL, currentFile, serverPath) {
const file = fs.createWriteStream(savePath[0] + `/${currentFile}`)
axios({
method: 'get',
url: `${storedIP}${reqURL}`,
responseType: 'stream',
headers: {
Authorization: `Bearer ${token}`
}
}).then(function (reponse) {
reponse.data.pipe(file)
hashCheck(currentFile, savePath, serverPath)
})

但是,这将返回以下两个错误:the provided value 'stream' is not a valid enum value of type XMLHttpRequestResponseType.Uncaught (in promise) TypeError: reponse.data.pipe is not a function

我尝试按照这篇文章中所说的去做:键入错误this.httpClient.get(...(。管道不是一个函数

但这使得一个窗口弹出窗口说这样的话:

windows script host 
Script: c:npmnode_moduleswebpackbinwebpack.js
Line: 1
Char: 1
Error: Invalid character
Code: 800A03F6
Source: Microsoft JScript compilation error

我进入了那个js文件,第1行是#!/usr/bin/env node

我也尝试卸载 webpack 并重新安装,但这没有帮助。

注意:如果这很重要,我正在使用带有类星体的 Axios。

如果您使用的是电子,则应将适配器设置为http而不是XMLHttpRequest

axios.defaults.adapter = require('axios/lib/adapters/http');

如果你得到response.data.pipe不是一个函数,似乎你只能在主线程中以流的形式获取response.data

https://github.com/axios/axios/issues/1474#issuecomment-380594110

ipcRenderer.send("downloadRequest"); // when downloadRequest is called

主线程

app.on("ready", async () => {
// other electron setup
ipcMain.on("downloadRequest", (event, arg) => {
// axios download code here
});
});

在电子版 9.0.4 中,不需要下面一行

axios.defaults.adapter = require('axios/lib/adapters/http');   

在渲染器中

ipcRenderer.send("download_file");

在您的主要用途中,以下代码

ipcMain.on("download_file", (event, args) => {
var url = "YourFileUrl";

// console.log(data)

require("axios").get(url, { responseType: 'stream' })
.then(res => {
var fileName = res.headers['content-disposition'].split("=")[1].split(""")[0];

const writer = require('fs').createWriteStream("Location to save the file");

new Promise((resolve, reject) => {

res.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;
});
});
}).catch((error) => {
console.log(error)
});    
}

(;

参考:

节点.js axios 下载文件和写入文件

最新更新