H5拍照、预览、压缩、上传采坑记录
H5拍照、预览、压缩、上传采坑记录
公司项目前段时间需要实现手机拍照上传的功能,本来以为用createObjectURL和canvas可以很轻松的实现,结果发现问题多多,特此记录下来。
DEMO预览(需用新标签页打开)
图片预览
在IOS上,竖着拍照片时,图片预览会旋转90°,横着拍照就没问题,我实验了一下,在IOS上,只有当图片的分辨率过大会出现这种情况。
最后实现图片预览效果借助了exif-js和megapix-image,exif-js
负责读取图片的EXIF信息,获取orientation
信息,然后用megapix-image
把图片数据渲染在img标签上,代码如下:
import EXIF from '../utils/exif';
import MegaPixImage from '../utils/megapix-image';/*** * @param file file对象* @param resImg 预览IMG标签* @returns {Promise}*/renderPreviewImg(file, resImg) {return new Promise(function (resolve, reject) {EXIF.getData(file, _=> {var allMetaData = EXIF.getAllTags(file);var orientation = allMetaData.Orientation;var mpImg = new MegaPixImage(file);mpImg.render(resImg, {maxWidth: 1024,maxHeight: 1024,// quality: 0.6,orientation: orientation}, resolve);});});}
无刷新压缩上传
思路有两种:
用canvas的toDataURL()API,直接将base64文本传递过去
自己构造File对象,ajax上传
第一种方法需要服务器端做工作,而且上传数据量会增大4/3,因此此方法只作为回退方案。
第二种方法的原理是用Uint8Array来构造Blob,再使用formData上传。
这里要注意的是:ArrayBuffer
不能被直接操作,必须通过typed array
来存取,而且Blob的构造函数也是typed array
。
完整代码如下:
this.renderPreviewImg(file, resImg).then(() => {try {var binaryData = null;if (!Blob || !ArrayBuffer || !Uint8Array) {// alert(123);binaryData = file;//如果不支持压缩,直接上传原始图片} else {//组装二进制var base64Data = $(resImg).attr('src');var byteString = atob(base64Data.split(',')[1]);var ab = new ArrayBuffer(byteString.length);var ia = new Uint8Array(ab);for (var i = 0; i < byteString.length; i++) {ia[i] = byteString.charCodeAt(i);}binaryData = new Blob([ia], {"type": file.type});}this.setState({uploadProgress: 0});//组装formDatavar fd = new FormData();fd.append('file', binaryData, 'img.jpg');fd.append('token', uploadToken);console.log(fd);return this.uploadBinaryDataToQiniu(fd, this.uploadSuccess.bind(this), this.handleUploadProgress.bind(this))} catch (e) {alert(e.message);}}).catch(function (e) {console.log(e);})
参考文章
http://tgideas.qq.com/webplat...
http://blog.csdn.net/hsany330...
H5拍照、预览、压缩、上传采坑记录相关推荐
- H5图片预览及上传(WEB前端)
H5图片预览及上传 web上传图片很简单,网上有许多的demo和js,但是本人嫌弃用那些会引入许多js包,所以还是用原生的jquery来写吧. 一.html布局文件 html有一个自己的上传文件控件- ...
- 技术干货 | “选图预览并上传”的场景如何解?全网最全方案汇总来了
简介: 你真的知道如何"上传"一张照片吗? 选择本地相册图片或者拍照,然后预览并且上传是移动应用中一个典型的使用场景,比如常见的身份证信息上传等. 不少客户都反馈有类似的场景,并且 ...
- axios获取图片显示_Vue.js+axios图片预览以及上传显示进度
在平时项目开发中,我们经常会对文件做一些上传操作,不仅仅要实现基本需求,也要兼顾用户体验,根据自己在工作中遇到的问题谈谈对图片上传的预览以及上传进度的优化. 1.搭建项目 基于Vue.js+axios ...
- 利用JS来进行多张图片的压缩、预览、上传
JS多张图片压缩上传 前言 代码 结尾 前言 最近在做的项目里有个关于多图片上传的,搞得我很久,查了很多资料,终于搞定,故此写一篇总结. 代码 前台我用的是jquery-1.8.3.min.js ht ...
- 【微信小程序】图片选择、转码、压缩、预览、上传,file与base64
0 前言 微信小程序中,上传图片,如标题,涉及图片选择.图片转码.图片压缩.图片预览.图片上传等 1 图片选择 需要使用微信提供的wx.chooseMedia chooseImage() {var t ...
- android h5选择图片上传,js-微信H5选择多张图片预览并上传(兼容ios,安卓,已测试)...
值得注意的是: 1.在微信H5中选择图片运用:wx.chooseImage, 上传图片:wx.uploadImage. 2.上传图片的时候务必是一张一张的上传的(建议采用递归) 3.一张图片上传成功后 ...
- h5 php 拍照上传图片,H5拍照、选择图片上传组件核心
背景 前段时间项目重构,改成SSR的项目,但之前用的图片选择上传组件不支持SSR(server-side-render).遂进行了调研,发现很多的工具.但有的太大,有的使用麻烦,有的不满足使用需求.决 ...
- H5拍照、选择图片上传组件核心
背景 前段时间项目重构,改成SSR的项目,但之前用的图片选择上传组件不支持SSR(server-side-render).遂进行了调研,发现很多的工具.但有的太大,有的使用麻烦,有的不满足使用需求.决 ...
- uni-app——开发微信小程序 因超过2MB限制无法打包预览、上传
分包技术 一.小程序对大小的限制 二.问题描述 1.描述 2.问题原因 三.解决方法 1.减少项目的大小的方法 2.分包技术 2.1 分包依据 2.2 分包步骤 四.相关知识点补充(pages.jso ...
最新文章
- 一文运维zookeeper
- -bash: sz: command not found
- Xcode真机调试(有证书)
- linux下的lamp环境的搭建!!!
- mac os 10.14.5 update failure
- PHP empty、isset、isnull的区别
- gitlab的升级【二】旧数据的备份和新数据的恢复
- 英伟达发布全球唯一千万亿级集成型 AI 工作组服务器
- python exe运行报 编码错误_python运行显示编码错误
- 我在华为做Android外包的真实经历!吊打面试官系列!
- 闪退没由报错_关于floor()报错注入,你真的懂了吗?
- 新图表来袭,FineReport新增热力地图、漏斗图、图表切换新功能
- 苹果maccmsv10和redis memcached缓存的若干问题解决!
- 20-10-032-安装-KyLin-2.6.1-单机版安装(MAC官网下载)
- 查询oracle表空间有什么数据,oracle查询表空间使用情况与查询有哪些数据库实例在运行...
- 分享大二时用python写的银行管理系统(超简单版)内附源码
- Eclipse中开发测试脚本
- word自动添加标题以及批量生成图片题注
- GIS空间分析之Clip
- 中台是什么,到底要解决什么问题?