鸿蒙Next开发中如何将选中图片存入沙箱

在鸿蒙Next开发中,如何将用户选中的图片保存到应用的沙箱目录?具体需要调用哪些API,以及权限和路径该如何处理?求一个完整的实现示例代码。

2 回复

简单!用 PhotoViewPicker 选图,再用 fs.copyFileSync() 把图片从临时路径复制到沙箱路径。记得先申请 ohos.permission.READ_IMAGE 权限,不然系统会傲娇不给你图~(代码细节?官方文档摸鱼时翻翻就有啦)

更多关于鸿蒙Next开发中如何将选中图片存入沙箱的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next开发中,将选中图片存入沙箱可通过以下步骤实现:

1. 申请权限

module.json5 中声明存储权限:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.READ_IMAGEVIDEO",
        "reason": "$string:reason_desc"
      },
      {
        "name": "ohos.permission.WRITE_IMAGEVIDEO",
        "reason": "$string:reason_desc"
      }
    ]
  }
}

2. 选择图片

使用 PhotoViewPicker 选择图片:

import { photoViewPicker } from '@kit.MediaKit';

async function selectImage() {
  try {
    const photoSelectOptions = new photoViewPicker.PhotoSelectOptions();
    photoSelectOptions.maxSelectNumber = 1; // 选择1张图片
    const photoViewPicker = new photoViewPicker.PhotoViewPicker();
    const result = await photoViewPicker.select(photoSelectOptions);
    return result.photoUris[0]; // 返回选中图片URI
  } catch (err) {
    console.error('选择图片失败:', err);
  }
}

3. 保存到沙箱

将图片保存到应用沙箱目录:

import { fileIo } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';

async function saveToSandbox(selectedImageUri: string) {
  try {
    // 获取沙箱路径
    const sandboxDir = globalThis.context.filesDir;
    const fileName = `image_${Date.now()}.jpg`;
    const destPath = `${sandboxDir}/${fileName}`;

    // 读取原图片文件
    const file = await fileIo.open(selectedImageUri, fileIo.OpenMode.READ_ONLY);
    const fileStats = await file.stat();
    const buffer = new ArrayBuffer(fileStats.size);
    await file.read(buffer);

    // 写入沙箱
    const destFile = await fileIo.open(destPath, fileIo.OpenMode.WRITE_ONLY | fileIo.OpenMode.CREATE);
    await destFile.write(buffer);

    // 关闭文件
    await file.close();
    await destFile.close();

    console.log('图片保存成功:', destPath);
    return destPath;
  } catch (err) {
    console.error('保存失败:', (err as BusinessError).message);
  }
}

使用示例

// 组合调用
async function handleImageSave() {
  const imageUri = await selectImage();
  if (imageUri) {
    const savedPath = await saveToSandbox(imageUri);
    // 使用保存的沙箱路径进行后续操作
  }
}

注意事项

  • 确保已动态申请存储权限
  • 沙箱路径为应用私有目录,其他应用无法访问
  • 大文件建议使用流式读写避免内存溢出

通过以上代码即可实现图片选择并保存到应用沙箱目录。

回到顶部