vue 中使用blob导出,下载,验证码等的使用
Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取。
Blob 是一个构造函数,创建一个 Blob 的操作如下:
/** 下载excel文件流 * @params data [Object] 文件流 * type [String] 数据的 MIME 类型 *type有以下选择: *1、“application/msword” Word *2、“application/vnd.ms-excel” Excel *3、type: "image/png" 后台生成验证码图片 */ new Blob([data], {type})
一、利用axios实现导出文件或者下载文件
1、具体下载方式 ---- -----link = document.createElement("a") -----link.download = fileName -----link.href = href -----link.click(); axios({ method: 'POST', url: xxx,// 这里是后端的接口地址 responseType: 'blob', data: "传输的数据", }) .then(res => { // 假设res表示后端发来的流数据 let blob = new Blob([res], {type: "application/msword"}), // 此处为生成doc link = document.createElement("a"), href = window.URL.createObjectURL(blob); link.href = href; link.download = "下载后文件的文件名"; document.body.appendChild(link); link.click(); document.body.removeChild(link); window.URL.revokeObjectURL(href); // 释放掉blob对象 }) 2、具体下载方式 ---- window.location.href = url // 请求封装方式 axios.js export const BASEURL = "http://xxxxx"; // 本地测试 const instance = axios.create({ baseURL: BASEURL, timeout: 1000 * 60 * 5, }); //响应拦截器即异常处理 instance.interceptors.response.use( (res) => { if (true) { // 登陆异常拦截 // token 失效 if (res.data.code == 11010) { router.push({ path: "/" }); localStorage.setItem("token", null); localStorage.setItem("user", JSON.stringify({})); } } return res; }, (err) => { if (err && err.response) { switch (err.response.status) { case 400: err.message = "错误请求"; break; .... default: err.message = `连接错误${err.response.status}`; } } else { err.message = "连接到服务器失败"; } // this.$message.error(err.message); return Promise.resolve(err.response); } ); instance.interceptors.request.use((config) => { if (config.url.indexOf('createCode') != -1 || config.url.indexOf('downloadRoomData') != -1 || config.url.indexOf('downloadRoomCardData') != -1) { config.responseType = 'blob' // 记住 这里设置blob是最关键的地方没有这个设置无法下载 console.log(config) } const token = localStorage.getItem("logintoken"); if (token) { config.headers["token"] = token; } if(/\/survey\/v1\/images\/download$/.test(config.url)){ config.responseType = 'arraybuffer' } return config; }); export const GET = (url, params) => instance({ url, params, }) .then((res) => Promise.resolve(res.data)) .catch((err) => {}); export const POST = (url, data) => instance .post(url, data) .then((res) => Promise.resolve(res.data)) .catch((err) => {}); export const PUT = (url, data) => instance .put(url, data) .then((res) => Promise.resolve(res.data)) .catch((err) => {}); export const DELETE = (url, data) => instance .delete(url, data) .then((res) => Promise.resolve(res.data)) .catch((err) => {}); config.js // 举例说明使用方法 export const xx= (data) => GET('请求地址', data); export const xx= (data) => POST('...', data); export const xx= (id) => DELETE('...' + "/" + id); export const uploadImage = BASEURL + '/upload/uploadImage'; // 页面使用 import { xx , uploadImage } from "../../api/config"; await downloadRoomData(parameter).then((res) => { this.loading = false let blob = new Blob([res], {type: "application/vnd.ms-excel"}); let url = window.URL.createObjectURL(blob); window.location.href = url this.$message.success("下载成功!"); }).catch((reg) => { this.loading = false this.$message.error('导出失败!请重新导出。') }) /* let blob = new Blob([res], {type: "application/vnd.ms-excel"}); *type有以下选择: *1、“application/msword” Word *2、“application/vnd.ms-excel” Excel */
二、实现图片验证码
示例:
async getcode() { await createCode().then((res)=>{ let blob = new Blob([res],{type: "image/png"}); let url = window.URL.createObjectURL(blob); this.ruleForm.codeimg = url }) },
努力到无能为力,拼搏到感动自己。
欢迎大家在下方多多评论。