【HarmonyOS】API9中datashare转internal的方法
【前言】
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"格式,对应的是应用外部的文件,那这该如何转换呢
【解决方案】
首先需要确认的是"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"去做想要的操作了。
【HarmonyOS】API9中datashare转internal的方法的更多相关文章
- 在C#中使用反射调用internal的方法
MSDN上解释Internal如下: The internal keyword is an access modifier for types and type members. Internal t ...
- Java中Object类的公有方法
HashCode();wait();notify();equals();getClass();toString();clone();finalize(); 这里只是简单介绍一下其中的几个函数: Has ...
- (转)ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了"ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务"错误,帮其解决后,发现很多人遇到过这样的问 ...
- 解析Jquery取得iframe中元素的几种方法
iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作,需要的朋友可以参考下 DOM方法:父窗口操作IFRAME:window.frames[&q ...
- 在html中添加script脚本的方法和注意事项
在html中添加script脚本有两种方法,直接将javascript代码添加到html中与添加外部js文件,这两种方法都比较常用,大家可以根据自己需要自由选择 在html中添加<script& ...
- MVC中使用Entity Framework 基于方法的查询学习笔记 (二)
解释,不解释: 紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话: @model IEnumerable&l ...
- ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法
ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法 (2016-10-21 16:49:53) 今天在做一个查询的时候,报了一个"ORA-01652无法通过 ...
- 转载:WinForm中播放声音的三种方法
转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753 ...
- win7中VS2010中安装CSS3.0问题解决方法
win7中VS2010中安装CSS3.0问题解决方法 在安装Standards Update for VS2010 SP1后,VS2010中没有CSS3.0问题,以下是我的解决方法 1.首先去官网 ...
- OSG中找到特定节点的方法
OSG中找到特定节点的方法 转自:http://38288890.blog.163.com/blog/static/19612845320072721549504/ 为了在OSG中找到需要的节点并对节 ...
随机推荐
- 驱动开发:探索DRIVER_OBJECT驱动对象
本章将探索驱动程序开发的基础部分,了解驱动对象DRIVER_OBJECT结构体的定义,一般来说驱动程序DriverEntry入口处都会存在这样一个驱动对象,该对象内所包含的就是当前所加载驱动自身的一些 ...
- What's the best way to read and understand someone else's code?
Find one thing you know the code does, and trace those actions backward, starting at the end Say, fo ...
- 系统评价——理想点TOPSIS法的R语言实现(五)
TOPSIS 法是一种常用的综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距.TOPSIS全称Technique for Order Preference by Simi ...
- 用 Go 剑指 Offer 11. 旋转数组的最小数字
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [ ...
- 结合ChatGPT和MINDSHOW自动生成PPT
结合chatGPT和MINDSHOW自动生成PPT应用场景 总结/朱季谦 一.首先,通过chatGPT说明你的需求,学会提问是Ai时代最关键的一步.你需要提供一些关键信息,如果没有关键信息,就按照大纲 ...
- day134:2RenMJ:TypeScript的抽象类&装饰器&命名空间&模块&编译配置文件&python中的类型注解
目录 1.抽象类 2.装饰器 3.命名空间 4.模块 5.编译配置文件 6.python的类型注解 1.抽象类 抽象类(abstract class)做为其它派生类的基类使用. 它们一般不会直接被实例 ...
- Java全栈开发/API
2023/4/16 记录我学习的网站 前端 vuejs axios异步请求 微信开发者文档 uniapp开发文档 快速参考备忘清单 免费前端接口 读取json vant4UI cubeUI mintU ...
- oss/obs对象存储上传图片,在浏览器输入地址却是下载图片。不能直接在浏览器上查看。
1.问题oss/obs对象存储上传图片获取链接地址后,在浏览器输入地址却是下载.不能直接在浏览器上面浏览图片信息.2.解决上传文件的时候需要设置:content-type类型,需要指示浏览器这是什么类 ...
- dataX源码学习
文章目录 前言 开始准备 运行配置 开始运行 JobContainer 1.进入init prepare schedule post阶段 this.invokeHooks(); 总结 前言 在用dat ...
- Java中数字相关的类有哪些?Nuber数字类和Math数学类详解
前言 我们在解决实际问题时,会经常对数字.日期和系统设置进行处理,比如在我们的代码中,经常会遇到一些数字&数学问题.随机数问题.日期问题和系统设置问题等. 为了解决这些问题,Java给我们提供 ...