详解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购物车实时结算特效实现思路
Sep 23 Javascript
node.js中的fs.writeFileSync方法使用说明
Dec 14 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
May 27 Javascript
页面间固定参数,通过cookie传值的实现方法
May 31 Javascript
微信小程序 检查接口状态实例详解
Jun 23 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
Nov 24 Javascript
vue cli 3.0 使用全过程解析
Jun 14 Javascript
ionic+html5+API实现双击返回键退出应用
Sep 17 Javascript
微信小程序全选多选效果实现代码解析
Jan 21 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
Jul 27 Javascript
JS实现炫酷雪花飘落效果
Aug 19 Javascript
JavaScript原型链详解
Nov 07 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
我的群发邮件程序
2006/10/09 PHP
phpMyAdmin 安装配置方法和问题解决
2009/06/08 PHP
完美解决PHP中文乱码
2009/11/26 PHP
PHP的SQL注入实现(测试代码安全不错)
2011/02/27 PHP
在html页面上拖放移动标签
2010/01/08 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
JavaScript之IE的fireEvent方法详细解析
2013/11/20 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
JS判断是否手机或pad访问实现方法
2016/12/09 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
Python实现截屏的函数
2015/07/25 Python
深入解析Python编程中JSON模块的使用
2015/10/15 Python
Python多线程爬虫简单示例
2016/03/04 Python
Python实现代码统计工具(终极篇)
2016/07/04 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
Python Flask基础教程示例代码
2018/02/07 Python
解决python "No module named pip" 的问题
2018/10/13 Python
Python生成指定数量的优惠码实操内容
2019/06/18 Python
如何使用python爬虫爬取要登陆的网站
2019/07/12 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
python操作toml文件的示例代码
2020/11/27 Python
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
售前工程师职业生涯规划
2014/03/02 职场文书
生物工程专业求职信
2014/09/03 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
董事长秘书工作总结
2015/08/14 职场文书
怎样写工作总结啊!
2019/06/18 职场文书
pandas求平均数和中位数的方法实例
2021/08/04 Python