electron 电子版上传进度

nafvub8i  于 2023-03-10  发布在  Electron
关注(0)|答案(1)|浏览(192)

我有一个电子应用程序,它能够上传非常大的文件到服务器通过HTTP渲染过程中没有用户输入。我决定使用axios作为我的HTTP客户端,它能够检索上传进度,但与此我遇到了一些问题。
浏览器支持的js和Node.js有时候并不友好,我使用fs.createReadStream函数来获取文件,但是axios不知道ReadStream对象是什么,我无法将这个流传输到FormData(我应该将文件放在FormData中)(在GitHub的问题标签上有几个主题,但是到目前为止还没有做任何事情)。
我结束了使用fs.readFileSync,然后form-data模块与其getBuffer()方法,但现在我的文件是完全加载在内存中上传之前,并与我的文件有多大,它杀死电子进程。
我在谷歌上找到了request库,它实际上能够通过管道发送流请求,但它已经过时,不再受支持,显然我无法从中获得上传进度。
我的选项用完了。你如何上传文件与电子没有用户输入(所以没有文件输入)不加载他们在内存中的前期?
P.S.在form-data github页面上,有一段代码解释了如何使用axios上传文件流,但它不起作用,没有发送任何内容,并且将库降级为一个问题主题也没有帮助...

const form = new FormData();
const stream = fs.createReadStream(PATH_TO_FILE);
 
form.append('image', stream);
 
// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders`
const formHeaders = form.getHeaders();
 
axios.post('http://example.com', form, {
  headers: {
    ...formHeaders,
  },
})
.then(response => response)
.catch(error => error)
xvw2m8pv

xvw2m8pv1#

我能够解决这个问题,我希望它能帮助任何面临同样问题的人。
因为request已经过时了,我查找了替代品,找到了用于NodeJS HTTP请求的got.js,它支持Streamfs.ReadStream等。
你还需要form-data,它允许将流放入FormData中并将其分配给一个键。
下面的代码解决了我的问题:

import fs from 'fs'
import got from 'got'
import FormData from 'form-data'

const stream = fs.createReadStream('some_path')

// NOT native form data
const formData = new FormData()

formData.append('file', stream, 'filename');

try {
    const res = await got.post('https://my_link.com/upload', {
        body: formData,
        headers: {
            ...formData.getHeaders() // sets the boundary and Content-Type header
        }
    }).on('uploadProgress', progress => {
        // here we get our upload progress, progress.percent is a float number from 0 to 1
        console.log(Math.round(progress.percent * 100))
    });

    if (res.statusCode === 200) {
        // upload success
    } else {
        // error handler
    }
} catch (e) {
    console.log(e);
}

在电子渲染过程中完美的作品!

相关问题