首页 > 其他分享 >【HarmonyOS】API9中datashare转internal的方法

【HarmonyOS】API9中datashare转internal的方法

时间:2023-06-05 11:59:00浏览次数:42  
标签:文件 fs err datashare HarmonyOS internal let cacheDir

【前言】

HarmonyOS 3.1 Release版本正式发布了,这个版本给我们带来了一个非常有用的API——FilePicker(文件选择器) @ohos.file.picker,使用这个API我们可以选取手机中的图片视频等用于分享,并且不需要配置任何权限就可以使用。具体的使用方法就不赘述了,官网可以看选择用户文件保存用户文件这两个文档,文档中有具体的说明。我们通过FilePicker(文件选择器)可以获取一个文件资源uri(如:datashare:///media/image/2),使用文件接口(@ohos.file.fs)就可以读写这个uri对应的文件。这给我们开发带来了极大的便利。

 

【问题】

然而3.1系统中有一些接口仍然使用的是“internal"协议如下图中,上传接口UploadConfig仅支持"internal"格式,"internal"对应的是应用内部的文件。但是文件选择器选返回的是"datashare"格式,对应的是应用外部的文件,那这该如何转换呢

cke_4015.png​​

 

【解决方案】

首先需要确认的是"internal路径"与"应用开发路径"之间的关系。以上传接口为例,internal://cache/目录对应的就是从Context中获取的应用开发路径cacheDir(应用内部存储中的缓存路径)。

也就是说下面两个路径对应的是同一个文件

路径1:

let context =getContext(this) as common.UIAbilityContext

let cacheDir =context.cacheDir

let path =cacheDir+"/dest.txt"

路径2:

let path ="internal://cache/dest.txt"

确认完这点以后我们只需要把外部的文件复制到cacheDir目录下就可以了,具体代码如下:

try {
 let URI = null;
 let DocumentSelectOptions = new picker.DocumentSelectOptions();
 let documentPicker = new picker.DocumentViewPicker();
 documentPicker.select(DocumentSelectOptions).then((documentSaveResult) => {
   URI = documentSaveResult[0];
   console.info('documentViewPicker.select to file succeed and URI is:' + URI);
   let srcFile = fs.openSync(URI, fs.OpenMode.READ_WRITE);
   let destFile = fs.openSync(cacheDir+"/dest.txt",fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
   // 读取源文件内容并写入至目的文件
   let bufSize = 4096;
   let readSize = 0;
   let buf = new ArrayBuffer(bufSize);
   let readLen = fs.readSync(srcFile.fd, buf, { offset: readSize });
   while (readLen > 0) {
     readSize += readLen;
     fs.writeSync(destFile.fd, buf);
     readLen = fs.readSync(srcFile.fd, buf, { offset: readSize });
   }
   // 关闭文件
   fs.closeSync(srcFile);
   fs.closeSync(destFile);

 }).catch((err) => {
   console.error('documentViewPicker.select failed with err: ' + err);
 });
} catch (err) {
 console.error('documentViewPicker failed with err: ' + err);
}

这样我们就完成了datashare到internal的转换,可以使用"internal://cache/dest.txt"去做想要的操作了。

标签:文件,fs,err,datashare,HarmonyOS,internal,let,cacheDir
From: https://www.cnblogs.com/mayism123/p/17457401.html

相关文章

  • 【HarmonyOS】详解低代码端云一体化开发之连接器
    ​【关键字】元服务、低代码平台、端云一体化开发、连接器、拖拽式UI 【1、写在前面】前面我们写了两篇文章分别介绍了低代码平台的基本使用和端云一体化开发中数据模型的使用,有需要的可以了解一下,文章地址贴在下面了:低代码平台的基本使用:https://developer.huawei.com/co......
  • org.springframework.security.authentication.InternalAuthenticationServiceExcepti
    添加如下配置即可1.在pom.xml添加<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.6.RELEA......
  • 【HarmonyOS】hap包在多台设备中安装和HarmonyOS应用含多个module安装问题
     在HarmonyOS应用开发过程中,大家会遇到一些hap安装问题,如多模块hap包存在调用如何在模拟器上统一运行、或者同一hap包如何在多台设备运行问题等,这里汇总一些hap安装问题解答,供大家参考。 【问题1】我的HarmonyOS工程创建了多个module,构建出的.app包,如何在模拟器上安装?   ......
  • 【HarmonyOS】初识低代码平台开发元服务
    【关键字】HarmonyOS、低代码平台、元服务开发、拖拽式开发【写在前面】今天要分享的是HarmonyOS中的低代码开发相关的内容,低代码开发是DevEcoStudio提供的一种UI界面可视化的构建方式,通过图形化的自由拖拽+数据的参数化配置,可以快速的构建UI界面,在DevEcoStudio的官方使用指南中......
  • unkonow internal error: Access violation - no RTTI data
    使用NavicatPremium12选择Mysql表时出现大量弹窗报错,导致sql文件执行不了,右键数据库执行外部文件也失败了。弹窗报错提示信息类似于:unkonowinternalerror:Accessviolation-noRTTIdata大概意思是提示非法访问,实际原因并不相关。真实原因疑似是其他查询窗口当时正在......
  • 【HarmonyOS】低代码元服务开发中的地图实现
    在元服务开发过程中,大家可能需要在应用中使用地图,如果使用SDK集成的方式,地图SDK包体积大小很大,集成后元服务大小可能会超过10M,这就超出了HAP包的大小限制。那么是否有其他途径可以在元服务中使用地图呢?笔者最近在学习AGC新推出的低代码开发元服务的文档时发现,他的景区模板(模板简介-......
  • jupyter 报错 500 : internal server error
    之前代码搬迁服务器出了如下问题:jupyter报错500:internalservererror老服务器charset-normalizer的版本是3.0.1,但是看知乎有个方法如下:pipinstall--force-reinstallcharset-normalizer==3.1.0也可以解决问题,就没重装3.0.1......
  • 【异常】java: Internal error in the mapping processor: java.lang.NullPointerExce
    本文目录一、背景描述二、错误原因三、解决方案一、背景描述项目背景:IDEA(2020.3)+Springboot(2.1.5.RELEASE)+maven报错内容:java:Internalerrorinthemappingprocessor:java.lang.NullPointerException二、错误原因错误原因还没有找到三、解决方案在使用mapstruct,IDEA......
  • The server encountered an internal error that prevented it from fulfilling this
    org.apache.ibatis.exceptions.PersistenceException:###Errorqueryingdatabase.Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Couldnotcreateconnectiontodatabaseserver.###Theerrormayexistincom/itheima/mapper/Br......
  • Sysinternals
    1.handleusage:handle[[-a[-l]][-v|-vt][-u]|[-c<handle>[-y]]|[-s]][-p<process>|<pid>][name][-nobanner]-aDumpallhandleinformation.-lJustshowpagefile-backedsectionhandles.-cClosest......