详解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 相关文章推荐
jquery.ui.progressbar 中文文档
Nov 26 Javascript
js获取页面description的方法
May 21 Javascript
javascript实现页面刷新时自动清空表单并选中的方法
Jul 18 Javascript
Javascript中Date类型和Math类型详解
Feb 27 Javascript
JS 中document.write()的用法和清空的原因浅析
Dec 04 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
Jan 31 Javascript
基于vue 动态加载图片src的解决方法
Feb 05 Javascript
angular5 httpclient的示例实战
Mar 12 Javascript
JS实现json对象数组按对象属性排序操作示例
May 18 Javascript
小程序实现横向滑动日历效果
Oct 21 Javascript
微信小程序实现点击页面出现文字
Sep 21 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
Nov 13 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
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
用javascript实现画板的代码
2007/09/05 Javascript
javascript获取当前ip的代码
2009/05/10 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
2015/11/30 Javascript
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
对Django中内置的User模型实例详解
2019/08/16 Python
python opencv实现证件照换底功能
2019/08/19 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
对Python 字典元素进行删除的方法
2020/07/31 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
自荐信封面
2013/12/04 职场文书
应聘自荐信
2013/12/14 职场文书
英语商务邀请函范文
2014/01/16 职场文书
初中高效课堂实施方案
2014/02/26 职场文书
小学语文课后反思精选
2014/04/25 职场文书
篮球比赛策划方案
2014/06/05 职场文书
服务口号大全
2014/06/11 职场文书
优秀党员事迹材料
2014/12/18 职场文书
采购内勤岗位职责
2015/04/13 职场文书
2015年秋季小学开学标语
2015/07/16 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android
SQL写法--行行比较
2021/08/23 SQL Server
在CSS中使用when/else的方法
2022/01/18 HTML / CSS
中国十大神话动漫电影排行榜 哪吒登顶 白蛇缘起排第七
2022/03/21 国漫