HarmonyOS 鸿蒙Next 通过FilePicker 选择的媒体文件,得到的uri地址如何转成File 类型文件
HarmonyOS 鸿蒙Next 通过FilePicker 选择的媒体文件,得到的uri地址如何转成File 类型文件
更多关于HarmonyOS 鸿蒙Next 通过FilePicker 选择的媒体文件,得到的uri地址如何转成File 类型文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
可以通过FileUri.path获取uri对应的文件路径转成File 类型文件 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/dataguard-get-file-url-V5
暂未提供转换成绝对路径的接口
通过FilePicker 选择的媒体文件,得到的uri地址,可使用fs.openSync接口,通过URI打开这个文件得到fd
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/select-user-file-V5
以上传图库中的图片为例
UI 层
import { fileIo as fs, picker } from '@kit.CoreFileKit';
import { copyFileToApp, uploadFileDemo } from '../common/Utils';
@Entry
@Component
struct Index {
@State uri: string = "";
build() {
Column() {
Button('获取 picker 文件')
.onClick(() => {
let options = new picker.PhotoSelectOptions();
let p = new picker.PhotoViewPicker();
p.select(options).then((res: picker.PhotoSelectResult) => {
this.uri = res.photoUris[0];
});
})
Button("上传文件")
.onClick(() => {
// 沙箱文件地址
let fileArray = this.uri.split("/");
let fileName = fileArray[fileArray.length - 1]
let p = getContext(this).cacheDir + "/" + fileName;
// 从公共目录拷贝到沙箱
try {
let file = fs.openSync(this.uri, fs.OpenMode.READ_ONLY);
let dstPath = getContext(this).cacheDir + '/' + fileName;
let file2 = fs.openSync(dstPath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); //先创建有读写权限的文件,再把不可读写的文件复制过来
fs.copyFileSync(file.fd, file2.fd);
} catch (e) {
console.error("txy copy error")
}
// 上传
uploadFileDemo(getContext(this), fileName);
})
}
}
}
上传
// 从沙箱目录上传文件
export function uploadFileDemo(ctx: Context, fileName: string) {
// 上传任务配置项
let files: Array<request.File> = [
{ filename: fileName, name: 'test', uri: 'internal://cache/' + fileName, type: 'txt' }
]
let data: Array<request.RequestData> = [{ name: 'name', value: "txy"}];
let uploadConfig: request.UploadConfig = {
url: 'https://agc-storage-drcn.platform.dbankcloud.cn/v0/test-rqcjj/' + fileName,
header: {'User-Agent': 'PostmanRuntime'},
method: 'PUT',
files: files,
data: data
}
// 上传响应体
let headerCallback = (header: object) => {
console.info('headers ' + JSON.stringify(header))
}
// 将本地应用文件上传至网络服务器
try {
request.uploadFile(ctx, uploadConfig)
.then((uploadTask: request.UploadTask) => {
uploadTask.on("headerReceive", headerCallback);
uploadTask.on('complete', (taskStates: Array<request.TaskState>) => {
for (let i = 0; i < taskStates.length; i++) {
console.info(`upload complete taskState: ${JSON.stringify(taskStates[i])}`);
}
});
})
.catch((err: BusinessError) => {
console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
})
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
}
}
更多关于HarmonyOS 鸿蒙Next 通过FilePicker 选择的媒体文件,得到的uri地址如何转成File 类型文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,通过FilePicker选择媒体文件后,获得的URI地址转为File类型文件,可以使用UriUtils
和FileProvider
来实现(注意:这里不涉及Java或C语言的具体代码)。
-
使用UriUtils解析URI:首先,利用
UriUtils
类解析URI,获取文件的路径信息。这通常涉及到解析URI的scheme、host、path等组成部分,以获取文件在设备上的实际位置。 -
获取ContentResolver:通过
getContentResolver()
方法获取ContentResolver
实例,它用于访问内容提供者提供的数据。 -
使用FileProvider或特定API:如果URI是content://类型,直接通过
ContentResolver
的openInputStream()
方法获取输入流,然后利用Java的FileOutputStream
将输入流写入到一个新的File对象中。对于file://类型的URI,可以直接解析URI的path部分来构造File对象。 -
处理权限:确保应用有权限访问所选文件。如果文件在外部存储上,需要申请并处理相应的存储权限。
示例代码逻辑(非具体实现):
Uri uri = ...; // 从FilePicker获取的URI
String filePath = UriUtils.getPathFromUri(context, uri);
File file = new File(filePath);
注意,实际实现需根据URI类型和具体需求调整。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html