我正在使用Ionic3相机和文件插件来处理来自用户Android Gallery应用程序的图像选择。该插件返回一个文件uri,我想使用该文件插件提取base64编码的图像,但当我试图从缓存目录读取该文件时,出现not_found_错误。下面是我的代码示例和一些日志输出:

this.camera.getPicture(this.getCameraOptionsForPhotoLibrary()).then((fileUri: string) => {

  const fileNameIndex: number = fileUri.lastIndexOf('/') + 1;

  // file:///storage/emulated/0/Android/data/com.myDomain.myApp/cache/
  const cacheDirectoryFromFileUri = fileUri.substring(0, fileNameIndex );

  //  FB_IMG_1532921240445.jpg?1532982282636
  const fileName = fileUri.substring(fileNameIndex);

  this.file.readAsDataURL(cacheDirectoryFromFileUri, fileName).then(base64 => {
    alert('base64 cacheDirectoryFromFileUri success: ' + JSON.stringify(base64));
  }, err => {
    alert('base64 cacheDirectoryFromFileUri err: ' + JSON.stringify(err));
  });

请让我知道,我可以提供更多的信息,以帮助排除故障。

最佳答案

在试图复制您的错误时,我没有收到“未找到”错误。
不过,这个代码块

this.camera.getPicture(this.getCameraOptionsForPhotoLibrary()).then((fileUri: string) => {

  const fileNameIndex: number = fileUri.lastIndexOf('/') + 1;

  // file:///storage/emulated/0/Android/data/com.myDomain.myApp/cache/
  const cacheDirectoryFromFileUri = fileUri.substring(0, fileNameIndex );

  //  FB_IMG_1532921240445.jpg?1532982282636
  const fileName = fileUri.substring(fileNameIndex);

  this.file.readAsDataURL(cacheDirectoryFromFileUri, fileName).then(base64 => {
    alert('base64 cacheDirectoryFromFileUri success: ' + JSON.stringify(base64));
  }, err => {
    alert('base64 cacheDirectoryFromFileUri err: ' + JSON.stringify(err));
  });
}

给了我这个错误
base64 cacheDirectoryFromFileUri err: {"code":5,"message":"ENCODING_ERR"}

我在用这些选项
{
  quality: 100,
  destinationType: this.camera.DestinationType.FILE_URI,
  encodingType: this.camera.EncodingType.JPEG,
  mediaType: this.camera.MediaType.ALLMEDIA,
  sourceType: this.camera.PictureSourceType.PHOTOLIBRARY
}

下一行
const cacheDirectoryFromFileUri = fileUri.substring(0, fileNameIndex );

给我这样的东西
/storage/emulated/0/WhatsApp/Media/WhatsApp Images/

把那条线改成下面的
const cacheDirectoryFromFileUri = 'file://'+fileUri.substring(0, fileNameIndex );

解决了这个问题。
或者,如果您在从相机获取图像后试图从缓存中获取图像,并希望获取base64编码字符串,则可以使用Camera.DestinationType:data\u url
destinationType: this.camera.DestinationType.DATA_URL

10-07 19:33
查看更多