Le processus d'exportation des fichiers
Le front-end envoie une demande, le back-end traite le flux de fichiers, et le front-end Blob
analyse et le télécharge
Processus de mise en œuvre:
Requête frontale
Besoin de changer en réponse au type arraybuffer
oublob
Si vous ne définissez pas le type de réponse, le fichier téléchargé apparaîtra déformé
responseType: 'arraybuffer'
Prenons l' axios
exemple de la bibliothèque de requêtes couramment utilisée
get
Demande d'écriture
axios.get(url, {
params: form,
responseType: 'arraybuffer'
// responseType: 'blob'
})
post
Demande d'écriture
axios.post(url, params, {
responseType: 'arraybuffer'
// responseType: 'blob'
})
Le traitement back-end renvoie le flux de fichiers
Le frontal Blob
analyse et télécharge via l' objet
Le nom de fichier et le type de fichier sont recommandés pour utiliser les données renvoyées par le backend, qui seront généralement placées dans l'en-tête de la réponse
Nom du fichier et type d'informations stockées dans content-disposition
etcontent-type
Lorsque le nom du fichier est chinois, le back-end est généralement transcodé et le front-end peut utiliser le decodeURIComponent
décodage
Analyser et télécharger
Selon la structure retournée dans la figure ci-dessus, prenez-la axios
comme exemple, qui res
est le paramètre des données renvoyées par le backend une fois la requête réussie.
let filename = decodeURIComponent(
res.headers['content-disposition'].split(';')[1].split('=')[1]
)
// let filename = '导出表格.xlsx' // 可以, 但不建议直接写文件名
let fileType = decodeURIComponent(res.headers['content-type'])
let blob = new Blob([res.data], {
type: fileType
// type: 'application/vnd.ms-excel' // 特殊情况下直接写文件的MIME类型
})
let url = window.URL.createObjectURL(blob)
// 创建一个临时的url指向blob对象
// 创建url之后可以模拟对此文件对象的一系列操作,例如:预览、下载
let a = document.createElement('a')
a.href = url
a.download = filename
// 下载
a.click()
// 释放这个临时的对象url
window.URL.revokeObjectURL(url)