HarmonyOS鸿蒙Next中base64图片存入沙箱,用弹窗权限保存至本地,弹窗预览是空白,但是可以保存成功

HarmonyOS鸿蒙Next中base64图片存入沙箱,用弹窗权限保存至本地,弹窗预览是空白,但是可以保存成功

let filePath = context.filesDir + "/test.jpg";

//防止沙箱重名导致下载失败
if (fileIo.accessSync(filePath)) {
  fileIo.rmdirSync(filePath)
}

const startIndex = base64.indexOf('9j') + 2; // 获取"9j"之后的位置
const result = base64.substring(startIndex);
let uri = `data:image/jpeg;base64,${result}`;
const dataBuffer = buffer.from(uri, 'base64')
const file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.writeSync(file.fd, dataBuffer.buffer)

let srcFileUris: Array<string> = [
// 获取需要保存到媒体库的位于应用沙箱的图片/视频uri
  fileUri.getUriFromPath(filePath)
]; 

这是存入沙箱的代码 是不是有问题


更多关于HarmonyOS鸿蒙Next中base64图片存入沙箱,用弹窗权限保存至本地,弹窗预览是空白,但是可以保存成功的实战教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

看看你的那个photoCreationConfigs的部分有配置嘛?

let uri: string = filesDir + `${this.SaveDialogArr[0].iSrc}`; //沙箱的文件路径
console.log(`-=-=uri:${uri}`)
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
try {
  // 指定待保存到媒体库的位于应用沙箱的图片uri
  let srcFileUri = uri;
  let srcFileUris: Array<string> = [
    fileUri.getUriFromPath(uri)
  ];
  // 指定待保存照片的创建选项,包括文件后缀和照片类型,标题和照片子类型可选
  let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
    {
      // title: `${this.item.name}`, // 可选
      fileNameExtension: 'mp4',
      photoType: photoAccessHelper.PhotoType.VIDEO,
      // subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选
    }
  ];
  // 基于弹窗授权的方式获取媒体库的目标uri
  let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
  // 将来源于应用沙箱的照片内容写入媒体库的目标uri
  let desFile: fs.File = await fs.open(desFileUris[0], fs.OpenMode.WRITE_ONLY);
  let srcFile: fs.File = await fs.open(srcFileUri, fs.OpenMode.READ_ONLY);
  await fs.copyFile(srcFile.fd, desFile.fd);
  fs.closeSync(srcFile);
  fs.closeSync(desFile);
  promptAction.showToast({
    message: '保存成功!!!请到相册查看' ,
    duration: 3000
  })
  this.DialogController?.close()
  console.info('create asset by dialog successfully');
} catch (err) {
  console.error(`failed to create asset by dialog successfully errCode is: ${err.code}, ${err.message}`);
}

更多关于HarmonyOS鸿蒙Next中base64图片存入沙箱,用弹窗权限保存至本地,弹窗预览是空白,但是可以保存成功的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


标题

这是第一段内容。

这是第二段内容。

而且从沙箱打开图片也是不能预览的

标题

这里是段落内容。沙箱的图片需要添加file协议才可以用。


有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

[file://+ 沙箱路径]

没毛病呀,

在HarmonyOS Next中,Base64图片存入沙箱后弹窗预览空白但能保存成功,通常是权限或解码问题。需检查:

  1. 确保ohos.permission.WRITE_MEDIA权限已声明并动态申请
  2. 确认Base64解码时使用正确的MIME类型(如image/png)
  3. 弹窗预览需使用系统文件管理器能力,检查URI路径是否正确
  4. 沙箱文件导出时需使用正确的媒体库接口

若路径和权限正确,可能是系统文件预览组件未及时刷新缓存导致。可通过重新挂载存储或重启设备验证文件完整性。

从代码来看,base64图片处理存在几个问题:

  1. base64数据处理不正确。直接截取"9j"后面的内容会导致base64数据不完整,应该保留完整的base64数据头(包括"data:image/jpeg;base64,"前缀)。

  2. 写入文件时建议改用更可靠的方式:

const decodedData = buffer.from(base64.split(',')[1], 'base64'); // 正确处理base64数据
const file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.writeSync(file.fd, decodedData.buffer);
fs.closeSync(file.fd); // 记得关闭文件
  1. 检查文件权限是否正确设置,确保应用有读写存储的权限。

  2. 预览空白可能是因为文件写入不完整或格式不正确导致的,建议验证写入的文件是否能正常打开。

建议使用完整的base64数据,并确保解码和写入过程无误。

回到顶部