El proceso de exportar archivos
El front-end envía una solicitud, el back-end procesa el flujo de archivos y el front-end lo Blob
analiza y descarga
Proceso de implementación:
Solicitud de front-end
Necesita cambiar en respuesta al tipo arraybuffer
oblob
Si no configura el tipo de respuesta, el archivo descargado se verá distorsionado
responseType: 'arraybuffer'
Tome la biblioteca de solicitudes de uso común axios
como ejemplo
get
Solicitar escritura
axios.get(url, {
params: form,
responseType: 'arraybuffer'
// responseType: 'blob'
})
post
Solicitar escritura
axios.post(url, params, {
responseType: 'arraybuffer'
// responseType: 'blob'
})
El procesamiento de back-end devuelve el flujo de archivos
La interfaz Blob
analiza y descarga a través del objeto.
Se recomienda que el nombre y el tipo de archivo utilicen los datos devueltos por el backend, que generalmente se colocarán en el encabezado de respuesta
Nombre de archivo y tipo de información almacenada content-disposition
ycontent-type
Cuando el nombre del archivo es chino, el back-end generalmente transcodifica y el front-end puede usar la decodeURIComponent
decodificación
Analizar y descargar
De acuerdo con la estructura devuelta en la figura anterior, tómela axios
como ejemplo, que res
es el parámetro de los datos devueltos por el backend después de que la solicitud sea exitosa.
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)