文件下载的报错

问题描述:首先是能够下载文件,文件是属于压缩文件,但是下载下来的数据比实际数据要大,导致了不能正常打开。

解决方案一:
使用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)
                    }
                })
            })
        })
    });
posted @ 2023-02-22 18:32  卿六  阅读(180)  评论(0编辑  收藏  举报