前端vue 封裝上傳文件和下載文件的方法 導入方法直接使用
1、上傳文件
upload.js
import axios from 'axios' import { Message } from "element-ui"; // * 封裝上傳文件的post方法 // * @param url // * @param data // * @returns {Promise} // 接口域名地址 // let baseURL = process.env.VUE_APP_API_BASE_URL let baseURL = 'https://jiangsihan.cn/' // 導出方法 export function uploads(url, file) { return uploadData(url, file) } function uploadData(url, file) { // 創(chuàng)建 FormData 對象 let formData = new FormData(); // 通過 append() 方法來追加數(shù)據(jù) formData.append("file", file) return new Promise((resolve, reject) => { axios.post(baseURL + url, formData, { headers: { 'Content-Type': 'multipart/form-data', 'X-Access-Token': localStorage.getItem('token'), } }).then(response => { resolve(response) }).catch(error => { // 錯誤響應處理 if (error.response) { // 對響應錯誤做點什么 switch (error.response.status) { case 403: Message({ message: '拒絕訪問', type: 'error' }); break case 500: Message({ message: '很抱歉,登錄已過期,請重新登錄', type: 'error' }); localStorage.clear(); sessionStorage.clear() setTimeout(() => { window.location.reload() }, 1000) break case 404: Message({ message: '很抱歉,資源未找到!', type: 'error' }); break case 405: Message({ message: '請求方式錯誤!', type: 'error' }); break case 504: Message({ message: '網(wǎng)絡超時!', type: 'error' }); break case 401: Message({ message: '未授權,請重新登錄!', type: 'error' }); localStorage.clear(); sessionStorage.clear() setTimeout(() => { window.location.reload() }, 1000) break default: Message({ message: data.message, type: 'error' }) break } } reject(error) }) }) }
導入:
import { uploads } from '../../utils/upload';
使用:
let url = '接口地址后綴' // file file對象格式 詳細見下方 uploads(url, file).then(res => { if (res.data.errCode == 0) { Message({ type: 'success', message: '上傳成功', duration: 1000 }) resolve(res) } resolve(res) }).catch(err => { reject(err) });
補充說明:
目前各大UI庫都有upload上傳文件的組件,內(nèi)置方法就含有file對象,拿到后傳入即可

2、下載文件
download.js
// 文件下載 // let baseURL = process.env.VUE_APP_API_BASE_URL //服務器地址 let baseURL = 'https://jiangsihan.cn/' //通過文件下載url拿到對應的blob對象 function getBlob(url) { return new Promise(resolve => { const xhr = new XMLHttpRequest() xhr.open('GET', url, true) xhr.responseType = 'blob' xhr.onload = () => { if (xhr.status === 200) { resolve(xhr.response) } } xhr.send() }) } //下載文件 js模擬點擊a標簽進行下載 function saveAs(blob, filename) { var link = document.createElement('a') link.href = window.URL.createObjectURL(blob) link.download = filename link.click() } // url 文件地址后綴 fileName文件名稱 export function downloadEvt(url, fileName) { //導出 let fileUrl = baseURL + url getBlob(fileUrl).then(blob => { saveAs(blob, fileName) }) } /** * download的屬性是HTML5新增的屬性 * href屬性的地址必須是非跨域的地址,如果引用的是第三方的網(wǎng)站或者說是前后端分離的項目(調(diào)用后臺的接口),這時download就會不起作用。 * 此時,如果是下載瀏覽器無法解析的文件,例如.exe,.xlsx..那么瀏覽器會自動下載,但是如果使用瀏覽器可以解析的文件,比如.txt,.png,.pdf....瀏覽器就會采取預覽模式 * 所以,對于.txt,.png,.pdf等的預覽功能我們就可以直接不設置download屬性(前提是后端響應頭的Content-Type: application/octet-stream,如果為application/pdf瀏覽器則會判斷文件為 pdf ,自動執(zhí)行預覽的策略) */
導入:
import { downloadEvt } from "@/utils/download";
使用:
downloadEvt(url, fileName);

浙公網(wǎng)安備 33010602011771號