HarmonyOS 保存图片时,如何获取目标图片的uri,或如何保存传入的图片?

由于无法申请WRITE_IMAGEVIDEO和READ_IMAGEVIDE权限,选择调用提供的API:showAssetsCreationDialog如何将需要保存的图片转为可识别的uri?使用:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-file-fileuri-V5#tostring10

获得uri:file://com.xxx.xxxx.ohoslib/https%3A//shot.image.video.qpic.cn/screen_shot/vid/r4100ata9is/93360_864_486_0.jpg,但使用此uri,拉起保存确认弹窗,点击保存后,相册中并未出现目标图片。是否uri不正确?或有无其他办法保存传入图片?

HarmonyOS
2025-01-10 08:56:42
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
fox280

具体请参考demo:

import { http } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
import util from '@ohos.util';
import { fileUri } from '@kit.CoreFileKit';
import fs, { ReadOptions } from '@ohos.file.fs';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { promptAction } from '@kit.ArkUI';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  url1: string = "xxxx";
  url2 : string =
    "xxxxx";
  build() {
    Column (){
      Column() {
        Text(this.url1)
        Button ("保存").onClick(()=>{
          this.downloadAndSave(this.url1, "jpg")
        })
      }.margin({top: 15, bottom :15})
      
      Column() {
        Text(this.url2)
        Button ("保存").onClick(()=>{
          this.downloadAndSave(this.url2, "png");
        })
      }.margin({top: 15, bottom :15})
      
    }.justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)
    .height('100%')
    .width('100%')
  }

  downloadAndSave (url: string, type: string) {
    httpDownload(url, type).then((result: DownloadResult)=>{
      if (result.isSuccess) {
        promptAction.showToast({message : "下载成功" })
      } else {
        console.error("失败:" + result.msg);
        promptAction.showToast({message : "下载失败,请查看日志" })
      }
    })
  }
}

interface DownloadResult {
  isSuccess: boolean,
  msg: string
}

async function httpDownload (imgUrl: string, imgType: string) : Promise<DownloadResult> {
  return new Promise((resolve, reject) => {
    http.createHttp().request(imgUrl, async (error: BusinessError, data: http.HttpResponse) => {
      // 下载失败
      if (error) {
        return resolve({ isSuccess: false, msg : "下载失败"});
      }

      // 数据格式不正确
      if ((data.result instanceof ArrayBuffer) == false) {
        return resolve({ isSuccess: false, msg : "图片保存失败:数据流不支持"});
      }
      // 保存到Cache目录下

      let imageBuffer: ArrayBuffer = data.result as ArrayBuffer;
      const newFileName = util.generateRandomUUID() + "." + imgType;
      const newFilePath = getContext().cacheDir + "/" + newFileName;
      const newFileUri = fileUri.getUriFromPath(newFilePath);
      let file: fs.File = await fs.open(newFileUri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
      await fs.write(file.fd, imageBuffer);
      await fs.close(file);
      console.info("文件路径:" + newFileUri);
      saveImageToAsset(newFileUri, imgType).then(()=>{
        // 保存成功
        return resolve({ isSuccess: true, msg : "保存成功"});
      }).catch((error: Error)=> {
        // 保存失败
        return resolve({ isSuccess: false, msg : "保存失败:" + error.message });
      });
    });
  })
}

async function saveImageToAsset(uri: string, nameExtension : string) : Promise<void> {
  console.info('ShowAssetsCreationDialogDemo: ' + uri);
  try {
    let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext());
    // 获取需要保存到媒体库的位于应用沙箱的图片/视频uri
    let srcFileUris: Array<string> = [uri];
    let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
      {
        title: 'test2', // 可选
        fileNameExtension: nameExtension,
        photoType: photoAccessHelper.PhotoType.IMAGE,
        // 可选,支持:普通图片、动态图片
        subtype: photoAccessHelper.PhotoSubtype.DEFAULT,
      }
    ];
    let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
    console.info('showAssetsCreationDialog success, data is ' + desFileUris);
    if (desFileUris.length == 0) {
      // 用户拒绝保存
      throw(new Error("用户拒绝保存"))
    }
    await createAssetByIo(uri, desFileUris[0]);

    return Promise.resolve();
  } catch (err) {
    console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
    return Promise.reject(err);
  }
}

let context = getContext(this);
const createAssetByIo = async (sourceFilePath: string, targetFilePath: string) => {
  try {
    console.log(`context.fileDir ===> ${context.filesDir}`)
    let srcFile: fs.File = fs.openSync(sourceFilePath, fs.OpenMode.READ_ONLY);
    let targetFile: fs.File = await fs.open(targetFilePath, fs.OpenMode.READ_WRITE);
    let bufSize = 14096;
    let readSize = 0;
    let buf = new ArrayBuffer(bufSize);
    let readOptions: ReadOptions= {
      offset: readSize,
      length: bufSize
    };
    let readLen = fs.readSync(srcFile.fd, buf, readOptions);
    while (readLen > 0) {
      readSize += readLen;
      fs.writeSync(targetFile.fd, buf, {length: readLen});
      readOptions.offset = readSize;
      readLen = fs.readSync(srcFile.fd, buf, readOptions);
    }
    fs.closeSync(srcFile);
    fs.closeSync(targetFile);
  } catch (error) {
    console.error(`createAssetByIo :: error , msg is ${error} `);
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
分享
微博
QQ
微信
回复
2025-01-10 10:27:30
相关问题
HarmonyOS 图片保存
1004浏览 • 1回复 待解决
HarmonyOS 图片保存功能
835浏览 • 1回复 待解决
HarmonyOS 图片保存失败
857浏览 • 1回复 待解决
使用SaveButton保存图片方式
1482浏览 • 1回复 待解决
HarmonyOS savebutton使用影响图片保存
813浏览 • 1回复 待解决
HarmonyOS图片保存相册问题
1444浏览 • 1回复 待解决
HarmonyOS 保存图片文件异常
1332浏览 • 1回复 待解决
如何保存网络图片到相册
1649浏览 • 1回复 待解决
HarmonyOS 组件生成图片保存
811浏览 • 1回复 待解决
HarmonyOS 图片保存到相册
809浏览 • 1回复 待解决
HarmonyOS 如何图片保存到相册
757浏览 • 1回复 待解决
获取网络图片保存到相册
2831浏览 • 1回复 待解决
求大佬告知如何保存图片到相册
2094浏览 • 1回复 待解决
关系数据库如何保存图片
8952浏览 • 2回复 待解决