Ionic 4:录制音频并发送到服务器(文件已损坏)

Ionic 4 : Recording Audio and Send to Server (File has been corrupted)

我想在移动应用程序中录制音频文件(iOS & Android) 并作为 ionic 4 中的 formData 传输到服务器。我已经使用 "cordova-plugin-media" 来使用以下逻辑捕获音频

  if (this.platform.is('ios')) {
      this.filePaths = this.file.documentsDirectory;
      this.fileExtension = '.m4a';
    } else if (this.platform.is('android')) {
      this.filePaths = this.file.externalDataDirectory;
      this.fileExtension = '.3gp';
    }

  this.fileName = 'recording'+new Date().getHours()+new Date().getMinutes()+new Date().getSeconds()+this.fileExtension;

    if(this.filePaths) {
this.file.createFile(this.filePaths,this.fileName,true).then((entry:FileEntry)=> {
        this.audio = this.media.create(entry.toInternalURL());
        this.audio.startRecord();
      });
   }

甚至我都试过不直接创建媒体 "File Creation"

I can record and play the audio, but If I am trying to send this file to server using below logics It won't send properly(corrupted data) and also web application unable to play .m4a extensions

.

如果我的代码有任何错误请纠正我

上传逻辑:

let formData:FormData = new FormData();
 formData.append('recordID' , feedbackID);
  that.file.readAsDataURL(filePath,file.name).then((data)=>{
       const audioBlob = new Blob([data], { type: file.type });
       formData.append('files', audioBlob, file.name);
       that.uploadFormData(formData,feedbackID); //POST Logics - 
     })

;

I have used the soultion as suggested by Ankush and it works fine. Used readAsArrayBuffer instead of readAsDataURL. The .m4a format has supported both ios and android. Also I can download the the same file from web application.

我正在使用以下代码将图像上传到服务器。我假设此代码中只需要进行一些修改即可传输媒体而不是图像文件。

private uploadPicture(imagePath: string, apiUrl: string): Observable<ApiResponse<ImageUploadResponseModel>> {

    return this.convertFileFromFilePathToBlob(imagePath).pipe(
      switchMap(item => this.convertBlobToFormData(item)),
      switchMap(formData => this.postImageToServer(formData, apiUrl))
    );
}

以上代码中使用的剩余函数:

private postImageToServer(formData: FormData, apiUrl: string): Observable<ApiResponse<ImageUploadResponseModel>> {
    const requestHeaders = new HttpHeaders({ enctype: 'multipart/form-data' });
    return this.http.post<ApiResponse<ImageUploadResponseModel>>(apiUrl, formData, { headers: requestHeaders });
}

private convertBlobToFormData(blob: Blob): Observable<FormData> {
    return new Observable<FormData>(subscriber => {
      // A Blob() is almost a File() - it's just missing the two properties below which we will add
      // tslint:disable-next-line: no-string-literal
      blob['lastModifiedDate'] = new Date();
      // tslint:disable-next-line: no-string-literal
      blob['name'] = 'sample.jpeg';
      const formData = new FormData();
      formData.append('file', blob as Blob, 'sample.jpeg');
      subscriber.next(formData);
      subscriber.complete();
    });
}

private convertFileFromFilePathToBlob(imagePath: string): Observable<Blob> {
    return new Observable<Blob>(subscriber => {
      const directoryPath = imagePath.substr(0, imagePath.lastIndexOf('/'));
      let fileName = imagePath.split('/').pop();
      fileName = fileName.split('?')[0];
      this.file.readAsArrayBuffer(directoryPath, fileName).then(fileEntry => {
          const imgBlob: any = new Blob([fileEntry], { type: 'image/jpeg' });
          imgBlob.name = 'sample.jpeg';
          subscriber.next(imgBlob);
          subscriber.complete();
      }, () => {
        subscriber.error('Some error occured while reading image from the filepath.');
      });
    });
}