一程H 2023-10-08 12:46 采纳率: 0%
浏览 44

vue 后端返回文件流,前端下载后无法打开

后端接口返回文件流,文件可以下载,但是打不开,显示“文件无法打开”,postman可以下载并打开。

封装的通用下载接口

export function download(url, params, filename) {
    downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)" })
    return service
        .post(url, params, {
            transformRequest: [
                (params) => {
                    return tansParams(params)
                },
            ],
            headers: { "Content-Type": "application/octet-stream" },
            responseType: "blob",
        })
        .then(async (data) => {
            const isLogin = await blobValidate(data)
            if (isLogin) {
                const blob = new Blob([data], { type: "application/vnd.ms-excel" })
                console.log(blob, "blob")
                saveAs(blob, filename)
            } else {
                const resText = await data.text()
                const rspObj = JSON.parse(resText)
                const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode["default"]
                Message.error(errMsg)
            }
            downloadLoadingInstance.close()
        })
        .catch((r) => {
            console.error(r)
            Message.error("下载文件出现错误,请联系管理员!")
            downloadLoadingInstance.close()
        })
}

点击按钮下载方法:传入接口地址,参数,文件名称

this.download(
                        `/keyLedgerExportExcel`,
                        { ids: this.ids },
                        `台账_${new Date().getTime()}.xlsx`
                    )

控制台打印的接口返回值,和最后的blob

img

接口返回值

img

能下载,但是打不开

img

  • 写回答

3条回答 默认 最新

  • 专业研究祖传Bug编写术 新星创作者: 编程框架技术领域 2023-10-08 13:42
    关注

    试一下修改blob的类型

    export function download(url, params, filename) {
        downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)" })
        return service
            .post(url, params, {
                transformRequest: [
                    (params) => {
                        return tansParams(params)
                    },
                ],
                headers: { "Content-Type": "application/octet-stream" },
                responseType: "blob",
            })
            .then(async (data) => {
                const isLogin = await blobValidate(data)
                if (isLogin) {
                    const blob = new Blob([data], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8" }) // 修改了Blob的type
                    console.log(blob, "blob")
                    saveAs(blob, filename)
                } else {
                    const resText = await data.text()
                    const rspObj = JSON.parse(resText)
                    const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode["default"]
                    Message.error(errMsg)
                }
                downloadLoadingInstance.close()
            })
            .catch((r) => {
                console.error(r)
                Message.error("下载文件出现错误,请联系管理员!")
                downloadLoadingInstance.close()
            })
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 10月8日