详解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分析、压缩工具 JavaScript Analyser
Nov 30 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
May 27 Javascript
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
Jun 21 Javascript
tangram框架响应式加载图片方法
Nov 21 Javascript
js给页面加style无效果的解决方法
Jan 20 Javascript
js拼接html注意问题示例探讨
Jul 14 Javascript
js随机生成网页背景颜色的方法
Feb 26 Javascript
JS+DIV实现鼠标划过切换层效果的方法
May 25 Javascript
Javascript+CSS3实现进度条效果
Oct 28 Javascript
js css3实现图片拖拽效果
Mar 04 Javascript
vue mint-ui学习笔记之picker的使用
Oct 11 Javascript
vue构建动态表单的方法示例
Sep 22 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
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
Javascript变量函数浅析
2011/09/02 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
详谈js模块化规范
2017/07/07 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
总结Python编程中三条常用的技巧
2015/05/11 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
Python二元算术运算常用方法解析
2020/09/15 Python
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
假日旅行社实习自我鉴定
2013/09/24 职场文书
安全生产承诺书范文
2014/05/22 职场文书
会计学专业自荐信
2014/06/25 职场文书
借名购房协议书范本
2014/10/06 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
导游词之上海东方明珠塔
2019/09/25 职场文书
OpenCV-Python实现轮廓拟合
2021/06/08 Python
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
MySQL基于索引的压力测试的实现
2021/11/07 MySQL