上传文件之后根据后端处理在返回一个下载文件

484 阅读1分钟

上传一个文件给后端,后端处理之后可能返回一个文件流也可能返回一个json格式的数据

// 上传文件之后返回一个下载文件
export const uploadAndDownload = (url, file, fileName, headers) => {
    const formData = new FormData()
    formData.append('file', file)
    return new Promise((resolve, reject) => {
        axios({
            url: url,
            method: 'post',
            data: formData,
            responseType: 'blob',
            headers: { 'Content-Type': 'multipart/form-data', ...headers }
        })
            .then(res => {
                if (res.type === 'application/json') {
                    // json 格式数据
                    let reader = new FileReader()
                    reader.readAsText(res, 'utf-8')
                    reader.onload = e => {
                        let a = JSON.parse(e.target.result)
                        console.log('a', a)
                        resolve(a)
                    }
                    return
                }
                // 文件流
                // 将文件流转成blob形式
                const blob = new Blob([res], { type: 'application/vnd.ms-excel' })
                const filename = `${fileName}.xls`
                // 创建一个超链接,将文件流赋进去,然后实现这个超链接的单击事件
                const elink = document.createElement('a')
                elink.download = filename
                elink.style.display = 'none'
                elink.href = URL.createObjectURL(blob)
                document.body.appendChild(elink)
                elink.click()
                URL.revokeObjectURL(elink.href) // 释放URL 对象
                document.body.removeChild(elink)
                reject()
            })
            .catch(e => {
                console.log(e)
                reject(e)
            })
    })
}