详解ionic本地相册、拍照、裁剪、上传(单图完全版)


Posted in Javascript onOctober 10, 2017

网络上已有的ionic图片选择上传博客碎片化过于严重,功能残缺或者引入了一些不必要的插件。这次以项目为契机,把ionic的图片选择、裁剪、上传整合一下,多图上传请戳ionic选择多张图片上传

插件安装

cordova plugin add cordova-plugin-camera //用于通过相机、相册选择图片并完成裁剪
cordova plugin add cordova-plugin-file-transfer //用于上传图片到服务器

将功能封装为服务

angular.module('starter.services', [])

//文件上传
.factory('UploadFile', function(Toast) {
 return {
 /**
  * 上传文件到服务器
  *
  * @param fileUrl 文件路径
  * @param server 服务器接口
  */
 uploadFile: function(fileUrl, server) {
  document.addEventListener("deviceready", onDeviceReady, false);
  function onDeviceReady() {
  var options = new FileUploadOptions();
  options.fileKey = "BeanYon";
  options.fileName = fileUrl.substr(fileUrl.lastIndexOf('/') + 1);
  options.mimeType = "image/jpeg";
  options.chunkedMode = false;

  var params = {account: localStorage.account};
  options.params = params;

  var ft = new FileTransfer();
  ft.upload(fileUrl, 
     encodeURI(server), 
     success, 
     err, 
     options);
  }

  function success(r){
  Toast.show("设置头像成功");
  }

  function err(error){
  Toast.show("上传头像失败,请确保网络正常后再试");
  }
 }
 }
})

//配置单张图片选择
.factory('SelectPicture', function(UploadFile, Toast) {
 return {
 /**
  * 从相机或图库选择一张图片
  * 
  * @param type 选择类型,0 拍照,1 相册
  * @param width 目标宽度
  * @param height 目标高度
  * @param scope $scope对象
  */
 chooseSinglePicture: function(type, width, height, scope) {
  document.addEventListener("deviceready", onDeviceReady, false);
  function onDeviceReady() {
  var options = {//相机配置
   targetWidth: width,
   targetHeight: height,
   quality: 100,
   allowEdit: true
  }

  if(type == 1){//图片源设置为相册
   options.sourceType = 2;
  }

  navigator.camera.getPicture(
   function(res){
   scope.avatar_src = res;
   scope.$apply();
   localStorage.avatar = res;
   UploadFile.uploadFile(res, "我的服务器地址");//传递自己的服务器接口地址
   }, function(res){
   Toast.show("选择头像失败");
   }, options
  );
  }
 },

 /**
  * 从图库选择多张图片
  */
 choosePictures: function() {
  window.imagePicker.getPictures(function(res){
  alert(res+",success");
  }, function(res){
  alert(res+",failed");
  }, {
  maximumImagesCount: 10, 
  width: 80, 
  height: 80, 
  quality: 80 
  });
 }
 }
});

调用服务

angular.module('starter.controllers', [])
.controller('MyCtrl', function($scope, $state, $ionicActionSheet, UploadFile,Toast, SelectPicture) {
 $scope.avatar_src = "img/default_avatar.jpg";

 /**
 *选择头像
 */
 $scope.selectAvatar = function(){
 // 显示操作表
 $ionicActionSheet.show({
  buttons: [
  { text: '<p style="font-size: 18px;">拍照<p>' },
  { text: '<p style="font-size: 18px;">从相册选择<p>' },
  ],
  buttonClicked: function(index) {
  //设置头像
  SelectPicture.chooseSinglePicture(index, 120, 120, $scope);
  return true;
  }
 });
 }
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 分栏效果实现代码
Aug 29 Javascript
Package.js  现代化的JavaScript项目make工具
May 23 Javascript
认识Knockout及如何使用Knockout绑定上下文
Dec 25 Javascript
AngularJS使用angular-formly进行表单验证
Dec 27 Javascript
JS实现图片预览的两种方式
Jun 27 Javascript
Angular 向组件传递模板的两种方法
Feb 23 Javascript
node使用promise替代回调函数
May 07 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
Aug 28 Javascript
JS函数内部属性之arguments和this实例解析
Oct 07 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
Apr 10 Javascript
jQuery属性选择器用法实例分析
Jun 28 jQuery
layui监听select变化,以及设置radio选中的方法
Sep 24 Javascript
防止页面url缓存中ajax中post请求的处理方法
Oct 10 #Javascript
Vue实现数字输入框中分割手机号码的示例
Oct 10 #Javascript
JS判断数组那点事
Oct 10 #Javascript
template.js前端模板引擎使用详解
Oct 10 #Javascript
AngularJS中table表格基本操作示例
Oct 10 #Javascript
AngularJS中控制器函数的定义与使用方法示例
Oct 10 #Javascript
JavaScript实现计数器基础方法
Oct 10 #Javascript
You might like
怎样在php中使用PDF文档功能
2006/10/09 PHP
php结合表单实现一些简单功能的例子
2011/06/04 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
解决FLASH需要点击激活的代码
2006/12/20 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
深入理解angular2启动项目步骤
2017/07/15 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
python3利用tcp实现文件夹远程传输
2018/07/28 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
OpenCV模板匹配matchTemplate的实现
2019/10/18 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
物业管理个人自我评价
2013/11/08 职场文书
致跳高运动员加油稿
2014/02/12 职场文书
《高尔基和他的儿子》教学反思
2014/04/09 职场文书
保护环境倡议书100字
2014/05/19 职场文书
走群众路线剖析材料
2014/10/09 职场文书
乱世佳人观后感
2015/06/08 职场文书
新闻通讯稿范文
2015/07/22 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
Python机器学习之KNN近邻算法
2021/05/14 Python
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python