详解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 相关文章推荐
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
May 27 Javascript
Javascript获取background属性中url的值
Oct 17 Javascript
jQuery基于正则表达式的表单验证功能示例
Jan 21 Javascript
微信小程序tabbar不显示解决办法
Jun 08 Javascript
vue 父组件调用子组件方法及事件
Mar 29 Javascript
Vue中的vue-resource示例详解
Nov 02 Javascript
[jQuery] 事件和动画详解
Mar 05 jQuery
记一次用vue做的活动页的方法步骤
Apr 11 Javascript
jQuery控制input只能输入数字和两位小数的方法
May 16 jQuery
vue+moment实现倒计时效果
Aug 26 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
Feb 15 Javascript
uniapp开发小程序的经验总结
Apr 08 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通过COM使用ADODB的简单例子
2006/12/31 PHP
php实现的返回数据格式化类实例
2014/09/22 PHP
php实现的简单检验登陆类
2015/06/18 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
jQuery帮助之筛选查找 children([expr])
2011/01/31 Javascript
JavaScript中实现异步编程模式的4种方法
2014/09/24 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
原生javascript自定义input[type=radio]效果示例
2019/08/27 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
用python + openpyxl处理excel2007文档思路以及心得
2014/07/14 Python
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
Django中针对基于类的视图添加csrf_exempt实例代码
2018/02/11 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
Python基于os.environ从windows获取环境变量
2020/06/09 Python
Helly Hansen工作服美国官方网上商店:为最恶劣的环境
2019/09/04 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
介绍一下Python中webbrowser的用法
2013/05/07 面试题
房地产销售计划书
2014/01/10 职场文书
创业资金计划书
2014/02/06 职场文书
挂职自我鉴定
2014/02/26 职场文书
综合素质自我评价评语
2015/03/06 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
2015年出纳年终工作总结
2015/05/14 职场文书
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers