为了图片安全性,有时候上传图片后后台不会直接返回图片地址,会返回文件流的数据格式,这种格式需要处理下才能展示在页面上
 
// 使用axios请求上传接口
axios({
method: 'get',
url: url, // 请求地址
responseType: 'blob' // 设置接收格式为blob格式
}).then(res => {
// console.log(res)
if (res && res.data && res.data.size) {
const dataInfo = res.data
let reader = new window.FileReader()
// 使用readAsArrayBuffer读取文件, result属性中将包含一个 ArrayBuffer 对象以表示所读取文件的数据
reader.readAsArrayBuffer(dataInfo)
reader.onload = function (e) {
const result = e.target.result
const contentType = dataInfo.type
// 生成blob图片,需要参数(字节数组, 文件类型)
const blob = new Blob([result], { type: contentType })
// 使用 Blob 创建一个指向类型化数组的URL, URL.createObjectURL是new Blob文件的方法,可以生成一个普通的url,可以直接使用,比如用在img.src上
const url = window.URL.createObjectURL(blob)
console.log(url) // 产生一个类似 blob:d3958f5c-0777-0845-9dcf-2cb28783acaf 这样的URL字符串
}
}
})
 
其他文件格式转换:
base64图片转成blob图片,一般base64图片链接比较长,使用链接跳转打开时不太友好,可能会解析错误,可以转成blob图片打开
// 获取base64图片, url图片地址,
// 如果返回的图片地址不是base64格式,可以通过这个方法转换成base64
getFile (url) {
let reader = new FileReader()
reader.readAsDataURL(url)
reader.onload = function (e) {
const base64Data = e.target.result
// 调用dataURItoBlob转换方法
console.log(this.dataURItoBlob (base64Data))
}
}, // 将base64图片转化成blob图片, base64Data base64图片地址
dataURItoBlob (base64Data) {
// console.log(base64Data, base64Data.length)
let byteString = base64Data
if (base64Data.split(',')[0].indexOf('base64') >= 0) {
byteString = atob(base64Data.split(',')[1]) // base64 解码
} else {
byteString = unescape(base64Data.split(',')[1])
}
// 获取文件类型
let mimeString = base64Data.split(',')[0].match(/:(.*?);/)[1] // mime类型 // ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区
// let arrayBuffer = new ArrayBuffer(byteString.length) // 创建缓冲数组
// let uintArr = new Uint8Array(arrayBuffer) // 创建视图 let uintArr = new Uint8Array(byteString.length) // 创建视图 for (let i = 0; i < byteString.length; i++) {
uintArr[i] = byteString.charCodeAt(i)
}
// 生成blob图片
const blob = new Blob([uintArr], {
type: mimeString
})
console.log(uintArr, blob)
// 使用 Blob 创建一个指向类型化数组的URL, URL.createObjectURL是new Blob文件的方法,可以生成一个普通的url,可以直接使用,比如用在img.src上
return URL.createObjectURL(blob)
}

最近做登录的图片验证码,发现把接收格式设置成arraybuffer,更简单,这里把方法补充一下,一般我们的项目会有一个axios配置文件,设置请求拦截,响应,在这里我们要先设置一下

axios.js文件

import axios from 'axios'
import {
Message
} from 'element-ui'
import store from '@/store'
import {
getToken
} from '@/utils/auth'
import router from '@/router' const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
// withCredentials: true, // 跨域发送cookies配置
timeout: 10000,
method: 'post'
}) service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['X-Token'] = getToken()
}
return config
},
error => {
return Promise.reject(error)
}
) service.interceptors.response.use(
response => {
const res = response.data
if (res.responseCode) { // 其他的都是一些常规配置,根据你自己项目配置就好,主要注意这里加个判断,因为如果是文件流,是不会返回正常接口的res,code,data之类的数据,直接是一串字符,这里需要判断一下是不是文件流数据
if (res.responseCode !== '000000' && res.responseCode !== '000025') {
Message({
message: res.responseMsg || 'Error',
type: 'error',
duration: 2 * 1000
})
// 重新登录
if (res.responseCode === '000001') {
setTimeout(function() {
store.dispatch('user/resetToken').then(() => {
router.replace('/login')
})
}, 3000)
}
return Promise.reject(new Error(res.message || 'Error'))
} else {
return res
}
} else { // 如果没有返回responseCode,说明是文件流数据,直接把结果返回去
return res
}
},
error => {
Message({
message: error.message,
type: 'error',
duration: 2 * 1000
})
return Promise.reject(error)
}
) export default service

如果你的接口请求没有自己进行二次封装,使用统一请求方法的的,这里不能使用统一方法,需要单独引入axios,单独设置返回数据格式,或者你在请求拦截那里判断,如果是请求验证码接口就把返回格式设置成arrayBuffer,

import axios from './axios'

axios({
url: '/kaptcha/getKaptcha',
method: 'post',
responseType: 'arraybuffer'
}).then(res => {
console.log(66, res)
const blob = new Blob([res], { type: 'image/jpeg' })
const u = window.URL.createObjectURL(blob)
this.imgCode = u
})

打印的结果

后台接口看到效果

实际效果

参考文档: https://developer.mozilla.org/zh-CN/docs/Web/API/Blob

    https://blog.csdn.net/qq_34664239/article/details/94595508

vue 项目文件流数据格式转blob图片预览展示的更多相关文章

  1. vue文件流转换成pdf预览(pdf.js+iframe)

    参考文档:https://www.jianshu.com/p/242525315bf6 PDFJS: https://mozilla.github.io/pdf.js/     支持获取文件流到客户端 ...

  2. vue项目中编写一个图片预览的公用组件

    今天产品提出了一个查看影像的功能需求. 在查看单据的列表中,有一列是影像字段,一开始根据单据号调用接口查看是否有图片附件,如果有则弹出一个全屏的弹出层,如果没有给出提示.而且,从列表进入详情之后,附件 ...

  3. 强大的图片展示插件,JQuery图片预览展示插件

    只需要引入JQuery.js , viewer.css 和 viewer.js <!DOCTYPE html> <html lang="en"> <h ...

  4. 9种CSS3炫酷图片展开预览展示动画特效

    详细内容请点击 在线预览立即下载 这是一组共9款CSS3炫酷图片预览展示动画特效插件.css的新特性可以让我们制作出各种炫酷的动画效果.该图片预览展示动画特效就是一个很好的例子,该效果开始时图片堆叠在 ...

  5. 在 vue 中使用 vieiwer 图片预览插件

    https://blog.csdn.net/WestLonly/article/details/79801800?utm_source=blogxgwz0 首先,感谢原作者 官网链接 github地址 ...

  6. vue.js 图片预览

    Vue.js的图片预览的插件还是不少,但是找了半天还是没找到跟现在项目里能用得很顺手的,其实项目里图片预览功能很简单,点击放大,能双指缩放就可以了.部分vue.js的图片预览库都需要把图片资源单独拿出 ...

  7. vue-preview vue图片预览插件+缩略图样式

    一.安装 npm i vue-preview -S 二.main.js中  导入组件 //vue-preview 开始 import VuePreview from 'vue-preview'; // ...

  8. 【VUE】图片预览放大缩小插件

    From: https://www.jianshu.com/p/e3350aa1b0d0 在看项目时,突然看到预览图片的弹窗,感觉好僵硬,不能放大,不能切换,于是便在网上找下关于图片预览的插件,有找到 ...

  9. Vue PC端图片预览插件

    *手上的项目刚刚搞完了,记录一下项目中遇到的问题,留做笔记: 需求: 在项目中,需要展示用户上传的一些图片,我从后台接口拿到图片url后放在页面上展示,因为被图片我设置了宽度限制(150px),所以图 ...

随机推荐

  1. linux - mysql:查看 mysql 是否安装成功

    命令 rpm -q mysql 结果 成功: 失败:

  2. 阿里云服务器怎么用ip访问不了

    个人想做个网站,就买了个阿里云服务器,不得不说阿里的安全做的很好,但是对于我这种小白,就成了麻烦了 工具/原料   阿里云服务器 方法/步骤     首先百度搜索阿里云,进入登录界面,输入账号密码登录 ...

  3. Storm和Hadoop 区别

    Storm - 大数据Big Data实时处理架构   什么是Storm? Storm是:• 快速且可扩展伸缩• 容错• 确保消息能够被处理• 易于设置和操作• 开源的分布式实时计算系统- 最初由Na ...

  4. WordPress自定义菜单和修改去除多余的css

    这里主要是用于模板制作的,一般前端已经写好了,我们只要将前端的内容套用WordPress后台就可以了. 所以我们在模板制作过程中,需要自定义WordPress菜单. 在functions.php文件中 ...

  5. Go单引号和双引号区别

    首先做个测试,看下面那个选项是正确的: A. str:='abc'+'123'B. str:="abc"+"123"C. str:='123'+"ab ...

  6. Flutter参数的传递和接收

    上次只写了方法和参数,这次写了完整的示例,页面间参数的传递和接收的示例. 1.参数传递 用在程序上解释就是比如你进入一个商品选择列表,当你想选择一个商品的具体信息的时候,你就要传递商品编号,详细页面接 ...

  7. Linux学习笔记:vim

    目录 模式 命令模式 编辑模式 底行模式 .vimrc .viminfo .swap 本文更新于2019-09-05. 说明:下文中,使用{}引起表示自定义变量,根据实际情况填写.使用[]引起表示内容 ...

  8. Apache Jmeter教程(一) - 入门

    一.下载Jmeter 登录官网Jmeter下载,得到压缩包jmeter-5.0.tgz,下载地址:http://jmeter.apache.org/download_jmeter.cgi. 二.安装 ...

  9. 用cmd命令加密文件夹

    比如新建一个叫“大学财务”的文件夹,我希望这个文件夹下的内容是加密隐藏的. 查看的时候需要点击“大学财务.bat”这个文件,然后输入设置的密码即可. Cls @ECHO OFF title Folde ...

  10. Java—System类入门学习

    第三阶段 JAVA常见对象的学习 System类 System类包含一些有用的字段和方法,他不能被实例化 //用于垃圾回收 public static void gc() //终止正在运行的java虚 ...