ionic3 调取照片机,音频,视频插件 上传服务器

// import { HttpClient } from '@angular/common/http';


import { Injectable } from '@angular/core';


import { ImagePicker } from '@ionic-native/image-picker';//引入插件


import { ActionSheetController, Platform } from 'ionic-angular';

import { Camera } from '@ionic-native/camera'; //引入插件

import { Media, MediaObject } from '@ionic-native/media';

import { File } from '@ionic-native/file'; //引入插件

import { MediaCapture, CaptureVideoOptions, MediaFile, CaptureError, CaptureAudioOptions } from '@ionic-native/media-capture';

import { HttpService, AppGlobal } from '../../providers/http.service';

import { FileTransfer, FileTransferObject, FileUploadOptions } from '@ionic-native/file-transfer';

import { DatePipe } from '@angular/common';

/*

  Generated class for the ProblemReportingProvider provider.

  See https://angular.io/guide/dependency-injection for more info on providers

  and Angular DI.

*/

declare var cordova: any;

@Injectable()

export class ProblemReportingProvider {

  isAudioOrVedio = true;

  userParam = {

    "description": "测试",

    "sitePhotos": "测试",

    "phone": "测试",

    "eventTime": null,

    "eventAddress": "测试",

    "appid": "测试",

    "status": 1,

    "remark": "测试",

    "video": null,

    "voice": null

  };

  static _files = []

  private set files(value) {

    ProblemReportingProvider._files;

  }

  private get files() {

    return ProblemReportingProvider._files;

  }

  selectType: any = [];

  playAudio: any = true;

  filemenu = [];

  // public filePath: any; //录音文件的名字

  // public recordData: any; //录音对象

  storageDirectory: string = '';

  fileName: string = '';

  fileTransfer: FileTransferObject = this.transfer.create();

  constructor(private camera: Camera, private imagePicker: ImagePicker,

    public actionSheetCtrl: ActionSheetController, private file: File,

    private media: Media, private mediaCapture: MediaCapture, private httpservice: HttpService, private transfer: FileTransfer, public platform: Platform, ) {

    this.platform.ready().then(() => {

      // make sure this is on a device, not an emulation (e.g. chrome tools device mode)

      if (!this.platform.is('cordova')) {

        return false;

      }

      if (this.platform.is('ios')) {

        this.storageDirectory = cordova.file.tempDirectory;

      }

      else if (this.platform.is('android')) {

        this.storageDirectory = cordova.file.dataDirectory;

      }

      else {

        // exit otherwise, but you could add further types here e.g. Windows

        return false;

      }

    });

    console.log('Hello ProblemReportingProvider Provider');

  }

  // /***************** 选择相册图片功能和拍照功能****/

  // 调用相机时传入的参数

  private cameraOpt = {

    quality: 100,//图片质量

    sourceType: 1,

    saveToPhotoAlbum: true,

    correctOrientation: true,

  };

  // 调用相册时传入的参数

  private imagePickerOpt = {

    maximumImagesCount: 5 - this.selectType.length,//选择一张图片

    quality: 80

  };

  showPicActionSheet() {

    this.useASComponent();

  }

  upload: any = {

    url: 'http://************',          //接收图片的url

    fileKey: '',  //接收图片时的key

    headers: {

      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' //不加入 发生错误!!

    },

    params: {},        //需要额外上传的参数

    success: (data) => { alert(data); }, //图片上传成功后的回调

    error: (err) => { },  //图片上传失败后的回调

    listen: () => { }  //监听上传过程

  };

  // 使用ionic中的ActionSheet组件

  private useASComponent() {

    let actionSheet = this.actionSheetCtrl.create({

      title: '选择',

      buttons: [

        {

          text: '拍照',

          role: 'takePhoto',

          handler: () => {

            this.startCamera();

          }

        },

        {

          text: '从手机相册选择',

          role: 'chooseFromAlbum',

          handler: () => {

            this.openImgPicker();

          }

        },

        {

          text: '取消',

          role: 'cancel',

          handler: () => {

            console.log("cancel");

          }

        }

      ]

    });

    actionSheet.present().then(value => {

      return value;

    });;

  }

  // 启动拍照功能

  private startCamera() {

    const thisFrom = this;

    this.camera.getPicture(this.cameraOpt).then((imageData) => {

      this.selectType.push(imageData);

      this.uploadImg(imageData);

      alert('startCamera');

      alert(imageData);

      thisFrom.getCaption(imageData);

      let thisdate = new DatePipe('en-US').transform(new Date(), 'yyyy-MM-dd HH:mm:ss');

      this.filemenu.push({

        name: imageData,

        datetime: thisdate,

        url: AppGlobal.domain + imageData,

        filetype: '图片'

      });

    }, (err) => {

      this.httpservice.toast('ERROR:' + err); //错误:无法使用拍照功能!

    });

  }

  //截取字符

  getCaption(obj) {

    let index = obj.lastIndexOf('\/');

    obj = obj.substring(index + 1, obj.length);

    alert(obj);

    return obj;

  }

  // 打开手机相册

  private openImgPicker() {

    const thisForm = this;

    this.imagePicker.getPictures(this.imagePickerOpt)

      .then((results) => {

        for (var i = 0; i < results.length; i++) {

          thisForm.selectType.push(results[i]);

          this.uploadImg(results[i]);

          alert('startCamera');

          alert(results[i]);

          thisForm.getCaption(results[i])

          let thisdate = new DatePipe('en-US').transform(new Date(), 'yyyy-MM-dd HH:mm:ss');

          this.filemenu.push({

            name: results[i].name,

            datetime: thisdate,

            url: AppGlobal.domain + results[i],

            filetype: '图片'

          });

        }

        // alert('openImgPicker');

        // alert(thisForm.selectType);

      }, (err) => {

        this.httpservice.toast('ERROR:' + err); //错误:无法使用拍照功能!

      });

  }

  // 上传图片

  public uploadImg(path: string) {

    if (!path) {

      return;

    }

    // alert('uploadImg');

    // alert(path);

    // this.fileTransfer = new Transfer();

    let options: any;

    options = {

      fileKey: this.upload.fileKey,

      headers: this.upload.headers,

      // params: this.upload.params

    };

    alert(this.upload.url);

    const thisForm = this;

    this.fileTransfer.upload(path, thisForm.upload.url + '/image', options)

      .then((data) => {

        alert('fileTransfer.upload uploadImg');

        if (this.upload.success) {

          this.upload.success(JSON.parse(data.response));

          alert(this.upload.success(JSON.parse(data.response)));

        }

      }, (err) => {

        if (this.upload.error) {

          this.upload.error(err);

        } else {

          this.httpservice.toast('ERROR:' + err);

        }

      });

  }

  // 停止上传

  stopUpload() {

    if (this.fileTransfer) {

      this.fileTransfer.abort();

    }

  }

  // 删除图片

  onClickDetelePic(i) {

    this.selectType.splice(i, 1);

  }

  /*****************************录制音频*************************************/

  // cordova-plugin-media-capture 的使用

  startRecording_MediaCapture() {

    this.platform.ready().then(() => {

      // const ftObj: FileTransferObject = this.transfer.create();

      // 设置录音参数:duration限制录音长度,单位秒,仅ios有效

      let options: CaptureAudioOptions = { limit: 1, duration: 10 };

      const thisForm = this;

      this.mediaCapture.captureAudio(options)

        .then(

          function (mediaFiles: MediaFile[]) {

            var i, len;

            for (i = 0, len = mediaFiles.length; i < len; i += 1) {

              // alert("Record success! \n\n"

              //  + "file name: " + mediaFiles[i].name + "\n\n"

              //  + "size: " + (mediaFiles[i].size / 1024).toFixed(2) + "KB" + "\n\n"

              //  + "fullPath: " + mediaFiles[i].fullPath + "\n\n"

              //  + "lastModifiedDate: " + (mediaFiles[i].lastModifiedDate) + "\n\n"

              //  + "type: " + mediaFiles[i].type + "\n\n");

              // 上传

              thisForm.fileName = mediaFiles[i].name;

              thisForm.uploadFile(mediaFiles[i].fullPath, '/voile');

            }

          },

      );

    });

  }

  // cordova-plugin-media 的使用

  startRecording_Media() {

    this.platform.ready().then(() => {

      let mediaObj;

      var recordName = this.generateFileName() + ".wav";

      this.fileName = recordName;

      if (this.platform.is('ios')) {

        this.file.createFile(this.file.documentsDirectory, recordName, true).then(() => {

          mediaObj = this.media.create(this.file.documentsDirectory.replace(/^file:\/\//, '') + recordName);

          this.doRecord_Media(mediaObj);

        });

      } else if (this.platform.is('android')) {

        mediaObj = this.media.create(this.file.documentsDirectory || this.file.externalDataDirectory + recordName);

        this.doRecord_Media(mediaObj);

      } else {

        alert("Not cordova!");

        return;

      }

    });

  }

  doRecord_Media(mediaObj: MediaObject) {

    // 开始录音

    mediaObj.startRecord();

    // 监测录音状态的回调

    mediaObj.onStatusUpdate.subscribe(status => this.showRecordStatus(status));

    // 设置录音的长度,单位毫秒,ios / android 均有效

    window.setTimeout(() => mediaObj.stopRecord(), 10 * 1000);

    // 录音成功后的处理,如上传录音

    mediaObj.onSuccess.subscribe(() => {

      this.uploadFile(this.file.documentsDirectory || this.file.externalDataDirectory + this.fileName, '/voile')

      this.isAudioOrVedio = true;

      let thisdate = new DatePipe('en-US').transform(new Date(), 'yyyy-MM-dd HH:mm:ss');

      this.filemenu.push({

        name: this.file.documentsDirectory || this.file.externalDataDirectory + this.fileName,

        datetime: thisdate,

        url: AppGlobal.domain + this.file.documentsDirectory || this.file.externalDataDirectory + this.fileName,

        filetype: this.isAudioOrVedio ? '音频' : '视频'

      })

    });

    // 录音失败后的处理,如提示错误码

    mediaObj.onError.subscribe(error => alert('Record fail! Error: ' + error));

  }

  // 上传 File Transfer Plugin 的使用

  uploadFile(filePath, path) {

    // 设置上传参数

    let options: FileUploadOptions = {

      fileKey: "file",

      fileName: this.fileName,

      mimeType: this.isAudioOrVedio ? "audio/wav" : "vedio/mp4"

    };

    const ftObj: FileTransferObject = this.transfer.create();

    const thisForm = this;

    // alert("filePath:" + filePath);

    ftObj.upload(filePath,

      encodeURI(thisForm.upload.url + path), options).then(

        (data) => {

          alert(JSON.parse(data.response));

        },

        (err) => {

          alert("File upload fail! error:" + err.code);

        });

  }

  // 生成录音文件名的方法:yyyymmddhhmmss(月和日不足两位补0)

  complement(n) { return n < 10 ? '0' + n : n }

  generateFileName() {

    var date = new Date();

    return date.getFullYear().toString() + this.complement(date.getMonth() + 1) + this.complement(date.getDate()) + this.complement(date.getHours()) + this.complement(date.getMinutes()) + this.complement(date.getSeconds());

  }

  // 根据录音状态码返回录音状态的方法

  showRecordStatus(status) {

    var statusStr = "";

    switch (status) {

      case 0:

        statusStr = "None";

        break;

      case 1:

        statusStr = "Start";

        break;

      case 2:

        statusStr = "Running";

        break;

      case 3:

        statusStr = "Paused";

        break;

      case 4:

        statusStr = "Stopped";

        break;

      default:

        statusStr = "None";

    }

    this.httpservice.toast("status: " + statusStr);

  }

  /***********************视频************************** */

  onClikeVedio() {

    let options: CaptureVideoOptions = { limit: 1 };

    const thisForm = this;

    this.mediaCapture.captureVideo(options)

      .then(

        (mediaFiles: MediaFile[]) => {

          var i, len;

          for (i = 0, len = mediaFiles.length; i < len; i += 1) {

            // alert("Record success! \n\n"

            //  + "file name: " + mediaFiles[i].name + "\n\n"

            //  + "size: " + (mediaFiles[i].size / 1024).toFixed(2) + "KB" + "\n\n"

            //  + "fullPath: " + mediaFiles[i].fullPath + "\n\n"

            //  + "lastModifiedDate: " + (mediaFiles[i].lastModifiedDate) + "\n\n"

            //  + "type: " + mediaFiles[i].type + "\n\n");

            // 上传

            thisForm.fileName = mediaFiles[i].name;

            thisForm.uploadFile(mediaFiles[i].fullPath, '/video');

            this.isAudioOrVedio = false;

            let thisdate = new DatePipe('en-US').transform(new Date(), 'yyyy-MM-dd HH:mm:ss');

            this.filemenu.push({

              name: mediaFiles[i].name,

              datetime: thisdate,

              url: AppGlobal.domain + mediaFiles[i].fullPath,

              filetype: this.isAudioOrVedio ? '音频' : '视频'

            })

          }

        },

        (err: CaptureError) => this.httpservice.toast('ERROR:' + err)

      );

  }

}

你可能感兴趣的:(ionic3 调取照片机,音频,视频插件 上传服务器)