前端下载文件流

93 阅读1分钟

获取文件接口

/**
* 获取文件接口
*/
exportScore(id).then((response) => {

    const resData = response.data

    console.log(resData.type)

    const fileReader = new FileReader()

    fileReader.onload = function() {

        try {

            const jsonData = JSON.parse(fileReader.result) // 后台返回的信息对象

            Message({ message: jsonData.msg, type: 'error' })

        } catch (err) { // 解析成对象失败,说明是正常的文件流

            downloadBlob(response, 'xlsx')

        }

    }

    fileReader.readAsText(resData)

})

下载文件流

/**
* 下载文件流
*/

/**
* 解析blob响应内容并下载
* @param res blob响应内容
* @param mimeType MIME类型
*/

export function downloadBlob(res, mimeType) {

    console.log(mimeType)

    const mimeMap = {

        xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'

    }

    const aLink = document.createElement('a')

    const blob = new Blob([res.data], { type: mimeMap[mimeType] })

    // 从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.xlsx") 设置的文件名;

    const contentDisposition = decodeURI(res.headers['content-disposition'])

    const result = contentDisposition.replace(/\s+/g, '').replace('filename=', '').split(';')

    const fileName = result[1]

    aLink.href = URL.createObjectURL(blob)

    aLink.setAttribute('download', fileName) // 设置下载文件名称

    document.body.appendChild(aLink)

    aLink.click()

    document.body.removeChild(aLink)

}

最后一定要记录将responseType设置为blob,以 axios 为例: config.responseType = 'blob'