实现图片上传使用了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手机端实现上传图片流程的更多相关文章

  1. wap手机端解决返回上一页,js

    <input id="hd_referrer" type="hidden" />                <a href="j ...

  2. 关于手机端h5上传图片配合exif.min.js,processImg.js的使用

    首先这里有个new FileReader()的概念,这是h5新增的,用来把文件读入内存,并且读取文件中的数据.FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件 ...

  3. wap手机端按下 松开 滑动事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 使用localResizeIMG3+WebAPI实现手机端图片上传

    前言 惯例~惯例~昨天发表的使用OWIN作为WebAPI的宿主..嗯..有很多人问..是不是缺少了什么 - - 好吧,如果你要把OWIN寄宿在其他的地方...代码如下: namespace Conso ...

  5. PHP项目实现手机端和PC端的页面切换

    目前访问页面的要切换成手机端和PC端,原理是通过对设备作出判断,显示不同的功能和页面. 如果手机端和PC端的功能结构不相同,一般会写两套系统,一套适用于PC端,一套适用于手机端. 如果功能相同,则只需 ...

  6. 判断浏览器是pc端还是手机端

    1. 判断浏览器是pc端还是手机端 <script type="text/javascript"> var browser = { versions: function ...

  7. 涨姿势!手机端的META你知道多少?

    一.天猫 <title>天猫触屏版</title> <meta content="text/html; charset=utf-8" http-equ ...

  8. ThinkPHP3.2判断手机端访问并设置默认访问模块的方法

    ThinkPHP3.2判断是否为手机端访问并跳转到另一个模块的方法 目录结构 公共模块Common,Home模块,Mobile模块 配置Application/Common/Conf/config.p ...

  9. PHP判断客户端是PC web端还是移动手机端方法

    PHP判断客户端是PC web端还是移动手机端方法需要实现:判断手机版的内容加上!c550x260.jpg后缀变成缩略图PHP用正则批量替换Img中src内容,用正则表达式获取图片路径实现缩略图功能 ...

随机推荐

  1. 实战c++中的vector系列--vector&lt;unique_ptr&lt;&gt;&gt;初始化(全部权转移)

    C++11为我们提供了智能指针,给我们带来了非常多便利的地方. 那么假设把unique_ptr作为vector容器的元素呢? 形式如出一辙:vector<unique_ptr<int> ...

  2. texlive测试是否安装成功

    在完成TEX Live安装之后,自然你会希望试试看它是否正常工作,好让你在以后能够创建优美的文档和字体. 1.首先确认你可以执行tex程序: >tex --version TeX 3.14159 ...

  3. Fluent动网格【5】:部件变形

    在动网格中关于部件运动除了指定刚体运动外,有时还需要指定某些边界的变形,这种情况经常会遇到,尤其是与运动部件存在相连接边界的情况下,如下图中边界1运动导致与之相连的边界2和边界3发生变形. Fluen ...

  4. Oracle同一个用户下启动多个数据库实例

     oracle@yingxiang-testServer1 oradata]$ export ORACLE_SID=APPDB[oracle@yingxiang-testServer1 oradata ...

  5. C#获取文件版本信息

    使用FileVersionInfo获取版本信息 FileVersionInfo info = FileVersionInfo.GetVersionInfo(Application.Current.St ...

  6. 根据IP获取国家

    国外的还算比较权威的IP地址库,而且免费,每天调用次数不超过1000免费.超过另收费. public string Ip2Country(string ip) { try { string url = ...

  7. 安卓开发笔记——关于开源项目SlidingMenu的使用介绍(仿QQ5.0侧滑菜单)

    记得去年年末的时候写过这个侧滑效果,当时是利用自定义HorizontalScrollView来实现的,效果如下: 有兴趣的朋友可以看看这篇文件<安卓开发笔记——自定义HorizontalScro ...

  8. IOC容器特性注入第五篇:查找(Attribute)特性注入

    前面几篇文章分别介绍:程序集反射查找,特性,容器,但它们之间贯穿起来,形成查找Attribute注入IOC容器,就得需要下面这个类帮忙: 1.DependencyAttributeRegistrato ...

  9. [原]pomelo基础知识(一)

    1.pomelo基本介绍 http://blog.gfdsa.net/2013/06/04/pomelo/pomelo_study_two/ 2.如何配置一个gate服务器 (1)首先 需要在game ...

  10. [Full-stack] 网页布局艺术 - Less

    故事背景 一个过程: template/html ----> css ----> less ----> bootstrap/flex ----> Semantic-ui fle ...