HarmonyOS 鸿蒙Next 通过FilePicker 选择的媒体文件,得到的uri地址如何转成File 类型文件

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 通过FilePicker 选择的媒体文件,得到的uri地址如何转成File 类型文件

需要通过选择文件,分片上传服务器,现在取通过FilePicker 选择的媒体文件,得到的uri地址,new File(uripath)是报错的,我应该通过哪种方式来处理  也尝试了@ohos.request来创建上传任务,但是连接不到我们的服务器,到了上传流程中process阶段就中止了,未发现报错  期待能收到一个详细的demo


更多关于HarmonyOS 鸿蒙Next 通过FilePicker 选择的媒体文件,得到的uri地址如何转成File 类型文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

可以通过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类型文件,可以使用UriUtilsFileProvider来实现(注意:这里不涉及Java或C语言的具体代码)。

  1. 使用UriUtils解析URI:首先,利用UriUtils类解析URI,获取文件的路径信息。这通常涉及到解析URI的scheme、host、path等组成部分,以获取文件在设备上的实际位置。

  2. 获取ContentResolver:通过getContentResolver()方法获取ContentResolver实例,它用于访问内容提供者提供的数据。

  3. 使用FileProvider或特定API:如果URI是content://类型,直接通过ContentResolveropenInputStream()方法获取输入流,然后利用Java的FileOutputStream将输入流写入到一个新的File对象中。对于file://类型的URI,可以直接解析URI的path部分来构造File对象。

  4. 处理权限:确保应用有权限访问所选文件。如果文件在外部存储上,需要申请并处理相应的存储权限。

示例代码逻辑(非具体实现):

Uri uri = ...; // 从FilePicker获取的URI
String filePath = UriUtils.getPathFromUri(context, uri);
File file = new File(filePath);

注意,实际实现需根据URI类型和具体需求调整。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部