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

175 篇文章 1 订阅

原文出处:https://blog.csdn.net/u013007703/article/details/53196091

延伸阅读:Ionic2中的相册选择和拍照上传——ImgService

 

网络上已有的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: '拍照' },
        { text: '从相册选择' }
      ],
      buttonClicked: function(index) {
         //设置头像
         SelectPicture.chooseSinglePicture(index, 120, 120, $scope);
         return true;
      }
    });
  }
})

闫斌(BeanYon)
--------------------- 
作者:闫斌_BeanYon 
来源:CSDN 
原文:https://blog.csdn.net/u013007703/article/details/53196091 
版权声明:本文为博主原创文章,转载请附上博文链接!

可以使用ionic-native的Camera插件来实现上传相册中的图片和拍照上传。具体实现可以参考以下代码: // 导入相关模块 import { Camera, CameraOptions } from '@ionic-native/camera/ngx'; import { File } from '@ionic-native/file/ngx'; import { Transfer, TransferObject } from '@ionic-native/transfer/ngx'; // 初始化相关变量 private fileTransfer: TransferObject; private imageSrc: string; // 构造函数中初始化fileTransfer constructor(private camera: Camera, private file: File, private transfer: Transfer) { this.fileTransfer = this.transfer.create(); } // 上传图片方法 uploadImage() { // 设置相机选项 const options: CameraOptions = { quality: 100, destinationType: this.camera.DestinationType.FILE_URI, sourceType: this.camera.PictureSourceType.PHOTOLIBRARY, encodingType: this.camera.EncodingType.JPEG, mediaType: this.camera.MediaType.PICTURE } // 调用相机插件获取图片 this.camera.getPicture(options).then((imageData) => { // 获取文件名 const fileName = imageData.substring(imageData.lastIndexOf('/') + 1); // 获取文件路径 const path = imageData.substring(0, imageData.lastIndexOf('/') + 1); // 移动文件到临时目录 this.file.moveFile(path, fileName, this.file.cacheDirectory, fileName).then((result) => { // 获取临时文件路径 const filePath = result.nativeURL; // 设置上传参数 const options = { fileKey: 'file', fileName: fileName, chunkedMode: false, mimeType: 'image/jpeg', headers: {} }; // 开始上传 this.fileTransfer.upload(filePath, 'http://example.com/upload.php', options).then((data) => { // 上传成功,返回服务器返回的数据 console.log(data); }, (err) => { // 上传失败,打印错误信息 console.log(err); }); }, (err) => { // 移动文件失败,打印错误信息 console.log(err); }); }, (err) => { // 获取图片失败,打印错误信息 console.log(err); }); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值