HarmonyOS 鸿蒙Next中如何拷贝相机拍照的文件

HarmonyOS 鸿蒙Next中如何拷贝相机拍照的文件 如何拷贝相机拍照的文件,代码如下,但会报错文件不存在

async openCamera() {
  const pickerProfile: picker.PickerProfile = {
    cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK
  };
  const pickerResult: picker.PickerResult = await picker.pick(this.getUIContext().getHostContext(),
    [picker.PickerMediaType.PHOTO], pickerProfile);
  this.fileUri = pickerResult.resultUri;
  let path = this.getUIContext().getHostContext()?.filesDir + '/image.jpg';
  try {
    fileIo.copyFileSync(this.fileUri, path);
  }
  catch (error) {
    console.error('copyFileSync error: ' + error.message);
  }
}

报错截图

cke_1809.png


更多关于HarmonyOS 鸿蒙Next中如何拷贝相机拍照的文件的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

原因分析:

  • picker.pick() 返回的 resultUri 是一个指向临时文件的 URI(例如 file://...),但 fileIo.copyFileSyncsrc 参数需要的是字符串路径文件描述符(数字)
  • 直接传递 URI 字符串给 copyFileSync 会导致系统无法识别路径,从而报错“文件不存在”。

解决方案:

  1. 使用 fileIo.openSync 打开 URI 对应的文件,获取文件描述符(fd)
  2. 将 fd 作为 copyFileSync 的源参数,目标路径使用应用沙箱内的绝对路径。

修正后的代码:

async openCamera() {
  const pickerProfile: picker.PickerProfile = {
    cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK
  };
  const pickerResult: picker.PickerResult = await picker.pick(this.getUIContext().getHostContext(),
    [picker.PickerMediaType.PHOTO], pickerProfile);
  this.fileUri = pickerResult.resultUri;
  let path = this.getUIContext().getHostContext()?.filesDir + '/image.jpg';

  try {
    // 1. 通过 URI 打开文件,获取文件描述符 (fd)
    let file = fileIo.openSync(this.fileUri, fileIo.OpenMode.READ_ONLY);
    // 2. 使用 fd 作为源参数,拷贝到目标路径
    fileIo.copyFileSync(file.fd, path);
    // 3. 关闭文件描述符,释放资源
    fileIo.closeSync(file.fd);
    console.info('文件拷贝成功');
  } catch (error) {
    console.error('copyFileSync error: ' + error.message);
  }
}

关键说明:

  • fileIo.openSync:以只读模式打开 URI 对应的文件,返回一个包含 fd 的文件对象。
  • fileIo.copyFileSync:接受文件描述符(fd)作为源参数,支持直接拷贝到目标路径。
  • fileIo.closeSync:操作完成后必须关闭文件描述符,避免资源泄漏。

如果问题仍未解决,请检查:

  1. picker 返回的 resultUri 是否有效(可尝试打印该 URI 并确认其指向的文件存在)。
  2. 应用是否具有文件读写权限(需在 module.json5 中申请 ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA)。

更多关于HarmonyOS 鸿蒙Next中如何拷贝相机拍照的文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,拷贝相机拍照文件可通过MediaLibrary接口实现。使用mediaLibrary.getMediaAssets获取照片文件,通过mediaLibrary.getFileAssets查询文件路径。调用fileAsset.copyTo将文件复制到目标目录。需申请ohos.permission.READ_IMAGEVIDEO和ohos.permission.WRITE_IMAGEVIDEO权限。

在HarmonyOS Next中,拷贝相机拍照的文件需要使用正确的URI处理方式。根据你的代码,问题可能出在fileIo.copyFileSync无法直接处理pickerResult.resultUri返回的URI格式。建议使用@ohos.file.fs模块的copyFile方法,并确保源路径是有效的文件URI。

修改后的代码示例:

import picker from '@ohos.file.picker';
import fs from '@ohos.file.fs';

async openCamera() {
  const pickerProfile: picker.PickerProfile = {
    cameraPosition: picker.CameraPosition.CAMERA_POSITION_BACK
  };
  const pickerResult = await picker.pick(this.getUIContext().getHostContext(), 
    [picker.PickerMediaType.PHOTO], pickerProfile);
  
  if (pickerResult && pickerResult.resultUri) {
    let destPath = this.getUIContext().getHostContext().filesDir + '/image.jpg';
    try {
      await fs.copyFile(pickerResult.resultUri, destPath);
      console.log('File copied successfully');
    } catch (error) {
      console.error('Copy failed: ' + error.message);
    }
  }
}

注意:确保在module.json5中声明了必要的权限(如ohos.permission.READ_IMAGEVIDEO)和requestPermissions的调用。如果问题仍然存在,检查URI的格式是否正确,或使用fs.access验证文件是否存在。

回到顶部