对于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、base64、blob,三者之间的转化相关推荐

  1. URI、URL、URN三者之间的关系

    URI URI(Uniform Resource Identifier, 统一资源标识符),用来标识资源.例如:HTML文档.图像.视频片段.程序都是由一个UtRI进行标识的.URI通常由3部分组成: ...

  2. Calendar、Date、long类型的时间,三者之间如何转化

    1. Calendar类型转化为Date类型和long类型 Calendar calendar=Calendar.getInstance(); Date date=calendar.getTime() ...

  3. img 格式相互转换 url, base64,blob, file

    正常向后端传的文件就是file格式,存储到文件服务器 url -> base64  -> file url -> blob -> file url -> base64 - ...

  4. 你知道URL、URI和URN三者之间的区别吗?

    这是一个经典的技术争论,许多人都会自问:URL.URI,很可能还有URN,它们之间的区别是什么.虽然,现在我们简单地把 URN 和 URL 都看做 URI,但严格来说URI可以进一步划分为URL.UR ...

  5. PHP-FPM,Nginx,FastCGI 三者之间的关系

    2019独角兽企业重金招聘Python工程师标准>>> 本文介绍 PHP-FPM,Nginx,FastCGI 三者之间的关系,以及 Nginx 反向代理和负载均衡的配置. PHP-F ...

  6. js 获取图片url的Blob值并预览

    js 获取图片url的Blob值并预览 1)使用 XMLHttpRequest 对象获取图片url的Blob值 参考:https://www.cnblogs.com/tujia/p/6483255.h ...

  7. [转]ExtJs基础--Html DOM、Ext Element及Component三者之间的区别

    要学习及应用好Ext框架,必须需要理解Html DOM.Ext Element及Component三者之间的区别. 每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM ...

  8. servlet向ajax传递数据库,一、JSP、servlet、SQL三者之间的数据传递(前台与后台数据交互)...

    背景: 目前业界很流行的MVC(model-view-control)开发模式,理解为 模型是Bean, 视图是 Html/Jsp, 控制是Servlet, 关联数据库的Dao web的运行机制: 数 ...

  9. utf-8 GB2312 GBK三者之间的区别

    各个国家和地区所制定的不同 ANSI 编码标准中,都只规定了各自语言所需的"字符".比如:汉字标准(GB2312)中没有规定韩国语字符怎样存储.这些 ANSI 编码标准所规定的内容 ...

最新文章

  1. ASP.NET缓存 Cache之数据缓存
  2. php 上个月天数,php日期所在月的天数_PHP教程
  3. 打印出如下图案(菱形)
  4. js中console在一行内打印字符串和对象
  5. linux下dns设置详解
  6. 计算机配置文章,看电脑配置的“两个”小妙招!
  7. ServletContext_功能_获取文件服务器路径
  8. jmeter添加html,Jmeter 报告可视化 —— 配置生成测试报告仪表板,Jmeter + Jenkins 自动化构建生成 HTML 报告...
  9. 【OpenStack】【Keystone】安装与配置详解
  10. 私人飞机包机运营商flyExclusive通过与BitPay合作支持加密货币付款
  11. 电商系统设计之商品 (上)
  12. 推荐:“创建MOSS2007自定义字段类型实例”
  13. C++操作符operator的另一种用法
  14. 17.3 构建LinuxPC端QT软件上的ARM编译套件并进行测试
  15. mac html flash,苹果电脑flash过期无法打开网页的解决方法
  16. python opencv创建图像_打开国庆的正确方式,教你用OpenCV-Python轻松生成微信国庆版头像...
  17. 使用NAT打造FTP服务新法
  18. 服务器gosht引导盘,带RAID服务器能GHOST备份吗?
  19. 平安科技面试问题整理
  20. 获取get请求中的参数

热门文章

  1. ElasticSearch Java Api(二) -检索索引库
  2. 从Chrome源码看audio/video流媒体实现二
  3. Linux20180528 apache结合php 虚拟主机
  4. 中间件(1)分布式缓存
  5. SWT的UI线程和非UI线程
  6. 阿里云服务器下安装LAMP环境(CentOS Linux 6.3) 安装与配置 Apache 服务
  7. mac osx 上Eclipse/CDT问题及解决方案
  8. 没有安装hiredis
  9. 使用redis作为Return存储方式
  10. ubuntu16.04下下载baiduyun大文件