【前言】

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的方法的更多相关文章

  1. 在C#中使用反射调用internal的方法

    MSDN上解释Internal如下: The internal keyword is an access modifier for types and type members. Internal t ...

  2. Java中Object类的公有方法

    HashCode();wait();notify();equals();getClass();toString();clone();finalize(); 这里只是简单介绍一下其中的几个函数: Has ...

  3. (转)ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法

    早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了"ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务"错误,帮其解决后,发现很多人遇到过这样的问 ...

  4. 解析Jquery取得iframe中元素的几种方法

    iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作,需要的朋友可以参考下   DOM方法:父窗口操作IFRAME:window.frames[&q ...

  5. 在html中添加script脚本的方法和注意事项

    在html中添加script脚本有两种方法,直接将javascript代码添加到html中与添加外部js文件,这两种方法都比较常用,大家可以根据自己需要自由选择 在html中添加<script& ...

  6. MVC中使用Entity Framework 基于方法的查询学习笔记 (二)

    解释,不解释: 紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话: @model IEnumerable&l ...

  7. ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法

    ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法 (2016-10-21 16:49:53)   今天在做一个查询的时候,报了一个"ORA-01652无法通过 ...

  8. 转载:WinForm中播放声音的三种方法

    转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753 ...

  9. win7中VS2010中安装CSS3.0问题解决方法

    win7中VS2010中安装CSS3.0问题解决方法   在安装Standards Update for VS2010 SP1后,VS2010中没有CSS3.0问题,以下是我的解决方法 1.首先去官网 ...

  10. OSG中找到特定节点的方法

    OSG中找到特定节点的方法 转自:http://38288890.blog.163.com/blog/static/19612845320072721549504/ 为了在OSG中找到需要的节点并对节 ...

随机推荐

  1. 驱动开发:探索DRIVER_OBJECT驱动对象

    本章将探索驱动程序开发的基础部分,了解驱动对象DRIVER_OBJECT结构体的定义,一般来说驱动程序DriverEntry入口处都会存在这样一个驱动对象,该对象内所包含的就是当前所加载驱动自身的一些 ...

  2. 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 ...

  3. 系统评价——理想点TOPSIS法的R语言实现(五)

    TOPSIS 法是一种常用的综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距.TOPSIS全称Technique for Order Preference by Simi ...

  4. 用 Go 剑指 Offer 11. 旋转数组的最小数字

    已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [ ...

  5. 结合ChatGPT和MINDSHOW自动生成PPT

    结合chatGPT和MINDSHOW自动生成PPT应用场景 总结/朱季谦 一.首先,通过chatGPT说明你的需求,学会提问是Ai时代最关键的一步.你需要提供一些关键信息,如果没有关键信息,就按照大纲 ...

  6. day134:2RenMJ:TypeScript的抽象类&装饰器&命名空间&模块&编译配置文件&python中的类型注解

    目录 1.抽象类 2.装饰器 3.命名空间 4.模块 5.编译配置文件 6.python的类型注解 1.抽象类 抽象类(abstract class)做为其它派生类的基类使用. 它们一般不会直接被实例 ...

  7. Java全栈开发/API

    2023/4/16 记录我学习的网站 前端 vuejs axios异步请求 微信开发者文档 uniapp开发文档 快速参考备忘清单 免费前端接口 读取json vant4UI cubeUI mintU ...

  8. oss/obs对象存储上传图片,在浏览器输入地址却是下载图片。不能直接在浏览器上查看。

    1.问题oss/obs对象存储上传图片获取链接地址后,在浏览器输入地址却是下载.不能直接在浏览器上面浏览图片信息.2.解决上传文件的时候需要设置:content-type类型,需要指示浏览器这是什么类 ...

  9. dataX源码学习

    文章目录 前言 开始准备 运行配置 开始运行 JobContainer 1.进入init prepare schedule post阶段 this.invokeHooks(); 总结 前言 在用dat ...

  10. Java中数字相关的类有哪些?Nuber数字类和Math数学类详解

    前言 我们在解决实际问题时,会经常对数字.日期和系统设置进行处理,比如在我们的代码中,经常会遇到一些数字&数学问题.随机数问题.日期问题和系统设置问题等. 为了解决这些问题,Java给我们提供 ...