详解angularJS+Ionic移动端图片上传的解决办法


Posted in Javascript onSeptember 13, 2017

前端开发中经常会碰到图片上传的问题,网上的解决办法很多,可是有些图片上传的插件会有一些附属的插件,因此因为一个图片上传的问题可能额需要引入其他插件到项目中,久而久之项目会不伦不类,有时候插件之间也会有一些冲突,所以我们可以自己写一个图片上传的方法。

今天的demo是帮朋友做的一个移动端微信公众号项目,项目架构采用angular+ionic,因为对dom的操作jQuery会方便很多,但是jQuery比较厚重,所以最后选择用轻量级的zepto来对项目dom进行操作。

项目中有一个需求是上传个人作品,实现功能需要H5新对象 FormData对象、XMLHttpRequest对象、FileReader对象。只需要这三个对象即可,话不多说上代码。

dom结构:

详解angularJS+Ionic移动端图片上传的解决办法

js结构:

function1:

$scope.imgList = [];
$scope.setUploader = function () {
  var files = document.getElementById('photo');
  files.click();
  $(files).unbind().on('change',function (e) {
    var file = e.target.value;
    if (!/.(jpg|jpeg|png|GIF|JPG|png)$/.test(file)) {
      common.toast('图片类型必须是jpeg,jpg,png中的一种');
      return false;
    };
    fsubmit();
    readAsBinaryString();
  });
};

function2:

function fsubmit() {
  var itemImg = {};
  var form=document.getElementById("form1");
  console.log('form',form)
  var formData=new FormData(form);
  formData.append('wxdesigner_sid',$.fn.cookie('wxdesigner_sid'));
  formData.append('id',$scope.masterInfo.id);
  formData.append('pc','1');
  var oReq = new XMLHttpRequest();
  oReq.onreadystatechange=function(){
    if(oReq.readyState==4){
      if(oReq.status==200){
        var json=JSON.parse(oReq.responseText);
        console.log(json)
        if(json.Success) {
          itemImg = json.Data;
          $scope.imgList=itemImg;
          console.log($scope.imgList)
          $scope.$apply();
          itemImg = {};
        }
      }
    }
  };
  console.log(oReq)
  console.log(formData)
  oReq.open("POST", common.api+"Wxdesigner/Designer/uploadworks");
  oReq.send(formData);
  return false;
};

//判断浏览器是否支持FileReader接口
if(typeof FileReader == 'undefined'){
  //使选择控件不可操作
  file.setAttribute("disabled","disabled");
}

function3:

function readAsBinaryString(){
  var file = document.getElementById('photo').files[0];
  console.log(file)
  var reader = new FileReader();
  //将文件以二进制形式读入页面
  reader.readAsDataURL(file);
  reader.onload=function(f){
    $scope.masterInfo.thumblist.push(f.currentTarget.result)
    console.log($scope.masterInfo)
    $scope.$apply()
  }
}

整个图片上传的dom层很简单,一个form表单加上一个触发表单的函数(function1)。在function1中获取到<input type="file">的点击事件,在选择图片的时候会做个判断,如果超出支持的图片类型围的时候做个提醒。

然后在后面调用function2和function3。

在function2中获取form表单对象,然后创建一个FormData对象,将获取到的form表单传入FormData,然后append一些上传图片的参数。再创建一个new XMLHttpRequest对象,然后open发送XHR请求接口,send(formData)传递参数给接口。

到这个时候接口发送成功。

详解angularJS+Ionic移动端图片上传的解决办法

 这里的四个参数是formData中的四个参数

详解angularJS+Ionic移动端图片上传的解决办法

接口相应成功。

到这里有问题,图片上传成功写入数据库了,可是这时候需要在本地展示给用户看但是网页又不能直接访问设备本地的图片,因此我们需要FIleReader对象来对上传的图片文件读取为DataURL来展示在本地。

首先New 一个FileReader对象,然后将获取到的input file对象传入FileReader的 readAsDataURL()方法,此方法是将文件读取为DataURL的。

然后调用FileReader的onload方法,此方法的result会有转换之后的url,因此我们可以获取到此url,实际上是经过base64编码的。然后push到图片列表的最后

详解angularJS+Ionic移动端图片上传的解决办法

到此解决了问题,前端展示了本地的图片并且图片也写入了数据库,当页面再次刷新的时候拿到的是数据库中的数据

详解angularJS+Ionic移动端图片上传的解决办法

当然这里只是一个方法,移动端图片上传的插件比比皆是,甚至各种拖拽上传的图片上传插件也很多,此处适合项目中不用引入插件的图片上传的简单功能。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
图片格式的JavaScript和CSS速查手册
Aug 20 Javascript
jQuery滚动加载图片效果的实现
Mar 06 Javascript
原始的js代码和jquery对比体会
Sep 10 Javascript
JS实现闪动的title消息提醒效果
Jun 20 Javascript
JavaScript 函数的执行过程
May 09 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
Aug 01 Javascript
Javascript 函数的四种调用模式
Nov 05 Javascript
理解Angular的providers给Http添加默认headers
Jul 04 Javascript
Bootstrap实现的表格合并单元格示例
Feb 06 Javascript
vue项目打包部署到服务器的方法示例
Aug 27 Javascript
layui时间控件选择时间范围的实现方法
Sep 28 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
Mar 04 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
Sep 13 #Javascript
Js利用Canvas实现图片压缩功能
Sep 13 #Javascript
js 倒计时(高效率服务器时间同步)
Sep 12 #Javascript
js Date()日期函数浏览器兼容问题解决方法
Sep 12 #Javascript
JS鼠标3次点击事件实现代码及扩展思路
Sep 12 #Javascript
js实现1,2,3,5数字按照概率生成
Sep 12 #Javascript
js数组实现权重概率分配
Sep 12 #Javascript
You might like
PHP源代码数组统计count分析
2011/08/02 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
struts2 jquery 打造无限层次的树
2009/10/23 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
Python3实现连接SQLite数据库的方法
2014/08/23 Python
Python中装饰器高级用法详解
2017/12/25 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
Django视图类型总结
2021/02/17 Python
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
美国羽绒床上用品第一品牌:Pacific Coast
2018/08/25 全球购物
晚会主持词开场白
2014/03/17 职场文书
遗嘱公证书标准样本
2014/04/08 职场文书
《高尔基和他的儿子》教学反思
2014/04/09 职场文书
写给老师的保证书
2015/05/09 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
详解Flask开发技巧之异常处理
2021/06/15 Python
Java面试题冲刺第十九天--数据库(4)
2021/08/07 Java/Android