文件下载的报错
问题描述:首先是能够下载文件,文件是属于压缩文件,但是下载下来的数据比实际数据要大,导致了不能正常打开。
解决方案一:
使用responseType: 'blob'
,注意这不是在请求头中定义,这个时候下载下来的数据大小是正常的,但是需要去读取blob数据的时候,有两种方法,一种如下:
const rsp = await request.get(uri, {responseType: 'blob'})
const blob = new Blob([rsp], {type: 'application/vnd.ms-excel'})
let url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = '文件夹名字'
a.click();
这个方法的虽然可以下载下来文件,但是有两个不满足,第一个是a标签会打开一个额外的窗口,第二个是不能获取到下载地址。
const rsp = await request.get(uri, {responseType: 'blob'})
const reader = new FileReader();
reader.readAsText(rsp) // 读取blob数据的另一种方式 const text = await (new Responese(blob)).text()
reader.onload = function (result) {
const blob = new Blob([rsp], {type: 'application/vnd.ms-excel'})
const a = document.createElement('a');
a.href = url;
a.download = '文件夹名字'
a.click();
}
解决方案二:
因为要使用electron,最后搜到可以调用electron自带的发送请求,同时设置地址,就可以完成需求。
ipcMain.handle('version-down-load',async function (e, params) {
const { DIR } = require('./common');
const p = DIR.VERSION; // 文件该放置的地址
const win = getMainWindow(); // 获取到主进程
return new Promise((resolve, reject) =>{
win.webContents.downloadURL(params?.path);
win.webContents.session.once('will-download', (event, item, webContents) => {
let path =`${p}\\${params.name}.tar.gz`
item.setSavePath(path)
item.once('done', (event, state) =>{
if (state === 'completed') {
resolve(path)
}
})
})
})
});
行百里者半九十