详解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 相关文章推荐
让IE8支持DOM 2(不用框架!)
Dec 31 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
Sep 06 Javascript
js简单的表格添加行和删除行操作示例
Mar 31 Javascript
js实现特定位取反原理及示例
Jun 30 Javascript
jQuery实现的输入框选择时间插件用法实例
Feb 28 Javascript
jQuery实现可编辑的表格实例讲解(2)
Sep 17 Javascript
jQuery表单验证简单示例
Oct 17 Javascript
jQuery实现页面顶部下拉广告
Dec 30 Javascript
vue js秒转天数小时分钟秒的实例代码
Aug 08 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
Aug 28 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
Oct 24 Javascript
使用react+redux实现计数器功能及遇到问题
Jun 02 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长字符串定义方法
2012/07/12 PHP
php数组去重实例及分析
2013/11/26 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
PHP实现简易计算器功能
2020/08/28 PHP
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
javascript显示动态时间的方法汇总
2018/07/06 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
Vue2.0 $set()的正确使用详解
2020/07/28 Javascript
[46:23]OG vs EG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Python计算回文数的方法
2015/03/11 Python
Python创建模块及模块导入的方法
2015/05/27 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
python 字符串追加实例
2019/07/20 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
c++工程师面试问题
2013/08/04 面试题
方正Java笔试题
2014/07/03 面试题
秋季婚礼证婚词
2014/01/11 职场文书
客服部班长工作责任制
2014/02/25 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
盗窃罪辩护词范文
2015/05/21 职场文书
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL
Python+Selenium自动化环境搭建与操作基础详解
2022/03/13 Python
Vue+TypeScript中处理computed方式
2022/04/02 Vue.js