请求后端接口 返回的时一张图片 如何在img中显示?

preview里查看就是显示一张图片

console.log(img):

.]

用blob createObjectURL转换成地址后前端img还是访问不到的效果
结果

代码

 this._http.doGet(this, 'createQRCode', {id: this.lessonId}, (res) => {var img = document.createElement('img')const myBlob = new window.Blob([res.data], {type: 'image/jpeg'})console.log(myBlob)const qrUrl = window.URL.createObjectURL(myBlob)img.src = qrUrlimg.onload = function () {window.URL.revokeObjectURL(qrUrl)}const imgDiv = document.querySelector('.qr-div')imgDiv.appendChild(img)})

首先需要设置axios responseType: 'blob'
然后直接createObjectURL即可

    const qrUrl = window.URL.createObjectURL(res.data)var img = document.createElement('img')img.src = qrUrlimg.onload = function () {window.URL.revokeObjectURL(qrUrl)}const imgDiv = document.querySelector('.qr-div')imgDiv.appendChild(img)

url、base64、blob,三者之间的转化

对于vue项目,我们使用axiso来发送请求,如果传递二进制图片时出现乱码,这个是什么问题?

答:
axios 默认返回的是 json 文本形式,二进制图片数据被强制转换成了 json 文本形式。

解决方案:
我们在 axios 里面,responseType 默认返回数据类型是 json,将其改为返回数据类型 blob。

export function miniprogramQrcode (params) {return axios.post(env.MI_URL + '/XXXX/XXX/XXXX',params,// 将responseType的默认json改为blob{responseType: 'blob',emulateJSON: true}).then(res => {if (res.data) {return Promise.resolve(res.data)} else {throw res}}).catch(err => {return Promise.reject(err)})
}

接下来,就是处理blob对象,将其显示在前端页面

    createMiniQrcode (blob) {let img = document.createElement('img')img.onload = function (e) {// 元素的onload 事件触发后将销毁URL对象, 释放内存。window.URL.revokeObjectURL(img.src)}// 浏览器允许使用URL.createObjectURL()方法,针对 Blob 对象生成一个临时 URL。// 这个 URL 以blob://开头,表明对应一个 Blob 对象。img.src = window.URL.createObjectURL(blob)document.querySelector('.imgQrCode').appendChild(img)}

图片在后端的存储方式有哪些?

答:
一般来说,图片在后端的存储方式分为两种

(1)可以将图片以独立文件的形式存储在服务器的指定文件夹中,再将路径存入数据库字段中;
(2)将图片转换成二进制流,直接存储到数据库的 Image 类型字段中.

对于第一种存储方式,我们前端直接将存储路径赋值给 src 属性即可轻松显示。

对于第二种存储方式,我们前端需要将其二进制流交由 blob 对象处理,然后通过 blob 的 API 生成临时 URL 赋值给 src 属性来显示。

图片的三种表现形式url、base64、blob,三者之间是否可以转化?

答: 可以

1. url 转 base64

    // 原理: 利用canvas.toDataURL的API转化成base64urlToBase64(url) {return new Promise ((resolve,reject) => {let image = new Image();image.onload = function() {let canvas = document.createElement('canvas');canvas.width = this.naturalWidth;canvas.height = this.naturalHeight;// 将图片插入画布并开始绘制canvas.getContext('2d').drawImage(image, 0, 0);// resultlet result = canvas.toDataURL('image/png')resolve(result);};// CORS 策略,会存在跨域问题https://stackoverflow.com/questions/20424279/canvas-todataurl-securityerrorimage.setAttribute("crossOrigin",'Anonymous');image.src = url;// 图片加载失败的错误处理image.onerror = () => {reject(new Error('图片流异常'));};});
}

调用

    let imgUrL = `http://XXX.jpg`this.getDataUri(imgUrL).then(res => {// 转化后的base64图片地址console.log('base64', res)})

2. base64 转 blob

  // 原理:利用URL.createObjectURL为blob对象创建临时的URLbase64ToBlob ({b64data = '', contentType = '', sliceSize = 512} = {}) {return new Promise((resolve, reject) => {// 使用 atob() 方法将数据解码let byteCharacters = atob(b64data);let byteArrays = [];for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {let slice = byteCharacters.slice(offset, offset + sliceSize);let byteNumbers = [];for (let i = 0; i < slice.length; i++) {byteNumbers.push(slice.charCodeAt(i));}// 8 位无符号整数值的类型化数组。内容将初始化为 0。// 如果无法分配请求数目的字节,则将引发异常。byteArrays.push(new Uint8Array(byteNumbers));}let result = new Blob(byteArrays, {type: contentType})result = Object.assign(result,{// jartto: 这里一定要处理一下 URL.createObjectURLpreview: URL.createObjectURL(result),name: `图片示例.png`});resolve(result)})}

调用

    let base64 = base64.split(',')[1]this.base64ToBlob({b64data: base64, contentType: 'image/png'}).then(res => {// 转后后的blob对象console.log('blob', res)})

3. blob 转 base64

// 原理:利用fileReader的readAsDataURL,将blob转为base64
   blobToBase64(blob) {return new Promise((resolve, reject) => {const fileReader = new FileReader();fileReader.onload = (e) => {resolve(e.target.result);};// readAsDataURLfileReader.readAsDataURL(blob);fileReader.onerror = () => {reject(new Error('文件流异常'));};});}

调用

    this.blobToBase64(blob).then(res => {// 转化后的base64console.log('base64', res)})

在互联网环境中,大访问量,数据库速度和性能方面很重要。一般在数据库存储图片的做法比较少,更多的是将图片路径存储在数据库中,展示图片的时候只需要连接磁盘路径把图片载入进来即可。因为图片是属于大字段。一张图片可能1m到几m。这样的大字段数据会加重数据库的负担,拖慢数据库。在大并发访问的情况下很重要。这是一个经验。去看看dba对数据库性能调优方面的分析都能得到这个答案的:就是图片不要存储在数据库中。

接口返回的是一个图片文件而不是url 前端如何显示?相关推荐

  1. java zip 替换文件_替换一个Zip文件而不解压缩在Java

    我有一个zip文件,我想用另一个文件替换它里面的一个文件.因此,不需要删除zip条目,只需将zip条目的文件替换为另一个条目即可.替换一个Zip文件而不解压缩在Java 这是我试过的. public ...

  2. 打开html文件原理,为什么一个html文件在别人的电脑上显示这样的?

    为什么一个html文件在别人的电脑上显示这样的?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 为什么一个文件在别人的电 ...

  3. jmeter使用问题——将接口返回变量存储成csv文件

    在使用jmeter做接口测试时,一整个jmx测试计划中,存在多个线程,多个接口的测试 但是接口可以分类,比如业务接口.查询接口.更新接口等 考虑自动化接口测试一般都是一次性的,有完整的闭环链路,一般步 ...

  4. 请求接口返回的是一个html_搜狗美图 API 接口请求调用

    搜狗美图 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以POST方式提交图片即可.搜狗美图 API 接口每日都会更新一张美图,本 API 接口可选择生成当日美图,也 ...

  5. matlab .m 返回值,MATLAB一个M文件的function返回值怎么在另一个M文件中的函数调用这个返回值?...

    答:1.首先要在笔记本电脑上安装好指定版本的matlab软件并双击打开. 2.然后双击matlab图标打开其主页面,可以看到这个软件的按钮都是全英文单词的. 3.那么创建m文件的方法就是鼠标移动到Ne ...

  6. pytorch制作test和train下面还有类别的文件(从一个图片文件中复制)

    1.导入相关的包 import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as op ...

  7. 如何使用gcore工具获取一个core文件而不重启应用?

    解决方法: 解决: 问题: 当调试一个程序的时候,理想状态是不重启应用程序就获取core文件. 解决: gcore命令可以使用下面步骤来获取core文件: 1. 确认gdb软件包已经被正确安装. 2. ...

  8. 前端请求接口,接口返回字节流,下载word文件到本地

    一.接口准备 // 下载word模板getAttorneyTemplate(data){return axiosApi({method:'GET',url:apiList.attorneyTempla ...

  9. 调用图片文件夹中的任意图片随机显示_他来了,他来了,Mathpix拜拜了~~~文字、表格、公式图片识别神器V0.1测试版...

    (图0) img2txt V0.8 [正式版] 第1步:win10自带截图快捷键:Win+Shift+S,也可以用QQ等截图工具: 第2步:打开软件,完成初始配置(后续调用无需再配置),按需识别: ( ...

  10. 调用图片文件夹中的任意图片随机显示_hexo框架下,实现图片一键式上传到七牛云

    在使用hexo框架驱动个人博客时,图片的插入是一个比较费心的事情 以我为例,我使用hexo+Github搭建个人独立博客 但是Github仓库提供的存储空间是有限的,如果把图片保存到本地(对应的是Gi ...

最新文章

  1. python类方法调用装饰_Python3 @classmethod 函数装饰器 声明一个类方法
  2. Django两天搭建个人博客
  3. 【Linux】虚拟地址空间
  4. 自动分号插入 ASI
  5. Zygote和System进程的启动过程
  6. 【PAT甲级 一个字符数组是否被另一个包含】1092 To Buy or Not to Buy (20 分) C++
  7. 【小技巧】桌面图标出现蓝色问号的怎么办?
  8. arm workbench ide 用户指南_ARM_异常和中断
  9. 从王者荣耀看设计模式(一.策略模式)
  10. inner join去除重复_SQL多表查询:join表联结
  11. 设计模式学习笔记—策略模式
  12. 前端开发必备之MDN文档
  13. 【光波电子学】MATLAB仿真厄米特-高阶高斯光束以及绘制其光强分布图
  14. matlab串级控制系统设计,SVPWM在串级调速系统中的MATLAB仿真研究
  15. 使用PEG估值法简单选股(1)
  16. 微信JS-SDK说明文档
  17. SprngBoot引用外部jar包和本身日志接口冲突问题解决办法
  18. faceapp一直显示选择服务器,faceapp提示choosing a serve_faceapp提示choosing a serve解决办法_玩游戏网...
  19. chrome单击打开标贴在当前窗口的新标签页设置
  20. 利用7-zip软件压缩并加密自己的保密文件

热门文章

  1. 最美遇见最好的你,感谢!
  2. ido 0.5 发布
  3. 梦殇 chapter four
  4. 花瓣网 html,css+html如何仿花瓣网实现静态登陆页面?(代码实
  5. JS实现页面复制文字时自动加版权
  6. Maven的作用通俗介绍
  7. P2P流量检测8个方向
  8. 前端的debug调试
  9. 文献跟踪、文献订阅工具
  10. 江苏大学计算机学院换届,关于计算机学院各支部选举结果的批复