Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 电子上传与进步_Javascript_Node.js_Upload_Axios_Electron - Fatal编程技术网

Javascript 电子上传与进步

Javascript 电子上传与进步,javascript,node.js,upload,axios,electron,Javascript,Node.js,Upload,Axios,Electron,我有一个Electron应用程序,它能够通过HTTP将非常大的文件上传到服务器,而无需用户输入。我决定使用axios作为我的HTTP客户机,它能够检索上传进度,但我遇到了一些问题 浏览器支持的js和Node.js有时彼此并不“友好”。我使用了fs.createReadStream函数来获取文件,但是axios不理解ReadStream对象是什么,我无法通过管道(他们的GitHub问题选项卡上有几个主题,但到目前为止还没有做过任何处理)将该流传输到FormData(我应该将文件放入其中) 最后,我

我有一个Electron应用程序,它能够通过HTTP将非常大的文件上传到服务器,而无需用户输入。我决定使用
axios
作为我的HTTP客户机,它能够检索上传进度,但我遇到了一些问题

浏览器支持的js和Node.js有时彼此并不“友好”。我使用了
fs.createReadStream
函数来获取文件,但是
axios
不理解
ReadStream
对象是什么,我无法通过管道(他们的GitHub问题选项卡上有几个主题,但到目前为止还没有做过任何处理)将该流传输到
FormData
(我应该将文件放入其中)

最后,我使用了
fs.readFileSync
,然后使用
formdata
模块及其
getBuffer()
方法,但现在我的文件在上传之前完全加载到内存中,而且我的文件有多大,这会扼杀整个进程

通过谷歌搜索,我发现了
request
library,它实际上可以通过管道将流传送到请求,但它已被弃用,不再受支持,显然我无法从中获得上传进度

我别无选择了。如何使用Electron上传文件,而无需用户输入(因此无需文件输入),而不预先将其加载到内存中

另外,在
表单数据
github页面上,有一段代码解释了如何使用
axios
上传文件流,但它不起作用,没有发送任何内容,并且将库降级,因为一个问题主题建议也没有帮助

const form=new FormData();
const stream=fs.createReadStream(路径到文件);
form.append('image',stream);
//在Node.js环境中,您需要通过调用方法“getHeaders”在标题字段“Content Type”中设置边界`
const formHeaders=form.getHeaders();
轴心柱http://example.com,表格{
标题:{
…表格标题,
},
})
。然后(响应=>响应)
.catch(错误=>error)

我能够解决这个问题,我希望它能帮助任何面临同样问题的人

由于
request
已被弃用,我查找了替代方案,并找到了nodejshttp请求。它支持
Stream
fs.ReadStream

您还需要,它允许将流放入
FormData
中并将其分配给键

以下代码解决了我的问题:


从“fs”导入fs
从“got”导入got
从“表单数据”导入表单数据
const stream=fs.createReadStream('some_path')
//非本机表单数据
const formData=new formData()
append('file',stream,'filename');
试一试{
const res=等待获得的邮政信息('https://my_link.com/upload', {
正文:formData,
标题:{
…formData.getHeaders()//设置边界和内容类型头
}
}).on('uploadProgress',progress=>{
//这里我们得到上传进度,progress.percent是一个从0到1的浮点数
console.log(Math.round(progress.percent*100))
});
如果(res.statusCode==200){
//上传成功
}否则{
//错误处理程序
}
}捕获(e){
控制台日志(e);
}

在电子渲染器过程中工作完美

关于文件大小有什么限制吗?@corykliser没有发现任何限制。我在一个生产应用程序中使用了这种方法,我们的用户上传的文件非常大,我们讨论了超过1GB大小的zip文件,到目前为止还没有报告由于文件大小而无法上传