wap手机端实现上传图片流程
实现图片上传使用了WeUI uploader插件
WeUI:是一套同微信原生视觉体验一致的基础样式库,为微信Web开发量身设计
流程:图片上传用到了FileReader,FormData,用这两个基本能实现图片的预览和上传,实现图片压缩需要借助canvas。
(1)使用input file上传图片,用filereader读取用户上传的图片数据
(2)把图片数据传入img对象,然后将img绘制到canvas上,再调用canvas.toDataURL对图片进行压缩
(3)获取到压缩后的base64格式图片数据,转成blob(blob,二进制大对象,是一个可以存储二进制文件的容器)塞入formdata,再通过ajax提交formdata。
大致思路是(代码实现):
第一步:添加uploader.vue组件
uploader.vue示例代码
multiple:上传图片可多选
依据接口,需要添加请求头:enctype ="multipart/form-data"
第二步:上传图片前要先在前端做下限制,如果不合规则,提示相关信息
定义图片的类型、大小及上传数量,picsUrl存放图片数组,不符合规则的图片提示相关信息
第三步:将input中选择的图片地址通过FileReader获取后赋给新建的图片对象,然后将图片对象放到canvas画布上
先获取图片数据,也就是监听input file的change事件,然后获取到上传的文件对象files,将类数组的files转成数组,然后进行for循环遍历
通过FileReader获取后赋给新建的图片对象,然后将图片对象放到canvas画布上
var fd = new FormData(); //用来存放上传数据
var img = new Image(); //创建图像对象
var reader = new FileReader();//读取用户上传的图片数据
fd.append('files',blob); //追加上传数据
根据image对象获取图片的width、height,创建画布将图片的宽高对应的赋值给画布
注:canvas将图片画到画布上的时候需要确定canvas的尺寸,同时设定好drawImage的参数
依次对应:ctx.drawImage(img,dx,dy,w,h)
dx:原图像的左上角在目标canvas上x轴的位置
dy:原图像的左上角在目标canvas上y轴的位置
w:在目标canvas上绘制图像的宽度。允许对绘制的图像进行缩放(如不处理,绘制图片时宽度不会缩放)
h:在目标canvas上绘制图像的高度。允许对绘制的图像进行缩放(如不处理,绘制图片时高度不会缩放)
注:为了上传完整的图片,dx,dy需要设置为0,w和h需要设置为原始图片的宽度和高度。我们要等image对象下载完毕后获取其原始尺寸
var base64 = canvas.toDataURL('image/png'); //进行图片压缩
压缩图片并不是直接把图片绘制到canvas再调用一下toDataURL就可以
在IOS中,canvas绘制图片有两个限制:
(1) 图片的大小,图片超过200w像素,图片无法绘制到canvas上,调用drawImage的时候不会报错,用toDataURL获取图片数据的时候获取到的是空数据
(2) canvas的大小有限制,canvas的大小大于约500w像素(宽高乘积)时,图片画不出来,其他东西也画不出来
处理方法:
针对问题一:可以采取瓦片绘制。将图片分割成多块绘到canvas上;
针对问题二:可以对图片宽高进行压缩
第四步:图片上传
使用ajax,提交方式使用post
crossDomain:true //使用post提交时会连带提交cookie
var blob = base64ToBlob(base64); //将base64转为blob,使用base64提交时数据较大
数据上传进度使用的模拟进度,间隔0.03s执行一次。这样就实现了图片的压缩和上传。
图片上传效果见示例:http://www.qdfuns.com/notes/18123/7110b12b485098aab5dfc2c59760688c.html
还可扫描二维码:
wap手机端实现上传图片流程的更多相关文章
- wap手机端解决返回上一页,js
<input id="hd_referrer" type="hidden" /> <a href="j ...
- 关于手机端h5上传图片配合exif.min.js,processImg.js的使用
首先这里有个new FileReader()的概念,这是h5新增的,用来把文件读入内存,并且读取文件中的数据.FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件 ...
- wap手机端按下 松开 滑动事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 使用localResizeIMG3+WebAPI实现手机端图片上传
前言 惯例~惯例~昨天发表的使用OWIN作为WebAPI的宿主..嗯..有很多人问..是不是缺少了什么 - - 好吧,如果你要把OWIN寄宿在其他的地方...代码如下: namespace Conso ...
- PHP项目实现手机端和PC端的页面切换
目前访问页面的要切换成手机端和PC端,原理是通过对设备作出判断,显示不同的功能和页面. 如果手机端和PC端的功能结构不相同,一般会写两套系统,一套适用于PC端,一套适用于手机端. 如果功能相同,则只需 ...
- 判断浏览器是pc端还是手机端
1. 判断浏览器是pc端还是手机端 <script type="text/javascript"> var browser = { versions: function ...
- 涨姿势!手机端的META你知道多少?
一.天猫 <title>天猫触屏版</title> <meta content="text/html; charset=utf-8" http-equ ...
- ThinkPHP3.2判断手机端访问并设置默认访问模块的方法
ThinkPHP3.2判断是否为手机端访问并跳转到另一个模块的方法 目录结构 公共模块Common,Home模块,Mobile模块 配置Application/Common/Conf/config.p ...
- PHP判断客户端是PC web端还是移动手机端方法
PHP判断客户端是PC web端还是移动手机端方法需要实现:判断手机版的内容加上!c550x260.jpg后缀变成缩略图PHP用正则批量替换Img中src内容,用正则表达式获取图片路径实现缩略图功能 ...
随机推荐
- 译:5.RabbitMQ Java Client 之 Topics (主题)
在 上篇博文 译:4.RabbitMQ 之Routing(路由) 中,我们改进了日志系统. 我们使用的是direct(直接交换),而不是使用只能进行虚拟广播的 fanout(扇出交换) ,并且有可能选 ...
- 菜鸟学SSH(十九)——提高用户体验之404处理
只要做过WEB开发人对于“404”已经再熟悉不过了吧.当我们访问的资源不存在时,它就会跑出来跟你打招呼啦.但是默认情况下,404页面比较简陋,不是很友好.而且一般用户不知道404是个神马东东,还以为是 ...
- linux每日命令(6):rm命令
rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命令,使用的 ...
- 【Java】接口(interface)VS抽象类
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的.接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static f ...
- 【WPF】自定义形状的按钮Button
需求:做一个如下图所示的多边形按钮. <!-- 特殊形状的按钮 --> <Grid> <Polygon Points="0,0 140,0 190,42 140 ...
- redis Sentinel部署
sentinel 系统用于管理多个 Redis 服务器(instance) 执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常. 提醒 ...
- 大量删除MySQL中的数据
出现的背景: 公司做了一个redis相关的项目,其中mysql存储了很多统计数据.比如客户端上报的数据,redis实例的数据,应用的数据,机器的数据等.每天都在上报,采集,由于没有定期删除,数据大量累 ...
- c++类成员函数后边加const是为什么?
时间是让人猝不及防的东西,晴是有风阴时有雨,争不过朝夕,又念着往昔,偷走了青丝却留住一个你 #include <iostream> #include <string> usin ...
- Web上传文件的原理及实现
现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的Commons FileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2 ...
- Win10系统Ping端口及利用telnet命令Ping 端口
启用 telnet 客户端组件为 Ping 端口做准备 在程序界面下,选择“打开或关闭Windows功能”,如下图所示: 在打开的对话框中,找到“Telnet客户端”并勾选.最后点击“确定”,等待几分 ...