HarmonyOS 鸿蒙Next下载与文件管理按钮实现方案 HarmonyOS 鸿蒙Next中如何设计一个下载按钮下载文件到本地及一个文件管理按钮调用系统文件管理系统找到刚下载的文件的具体方案

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

HarmonyOS 鸿蒙Next下载与文件管理按钮实现方案
HarmonyOS 鸿蒙Next中如何设计一个下载按钮下载文件到本地及一个文件管理按钮调用系统文件管理系统找到刚下载的文件的具体方案

需求是,一个下载按钮,下载文件到本地。一个文件管理按钮,调用系统文件管理系,找到刚才下载的文件。请问有什么具体的方案

2 回复

参考下载文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/app-file-upload-download-V5#下载网络资源文件至应用文件目录

使用request.downloadFile,

下载到沙箱位置:filePath: filesDir + '/xxxx.png'(/data/app/el2/100/base/com.example.myapplication/haps/entry/files/xxx.jpg)

文件管理是指的手机自带的文件管理器么?是的话,需要将沙箱目录下的图片复制到手机管理器,再使用DocumentViewPicker拉起弹窗查看

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-file-picker-V5#documentviewpicker

```

import common from ‘@ohos.app.ability.common’;

import fs from ‘@ohos.file.fs’;

import { picker } from ‘@kit.CoreFileKit’;

import { image } from ‘@kit.ImageKit’;

import { resourceManager } from ‘@kit.LocalizationKit’;

import { BusinessError } from ‘@kit.BasicServicesKit’;

let context = getContext(this) as common.UIAbilityContext;

let fileNameArr = [‘food.png’]//将原图片放在rawfile下

@Entry

@Component

struct Page10 {

  @State message: string = ‘Hello World’;

  build() {

    Column() {

      Button(‘1、图片写入沙箱’)//将源文件放在rawfile目录下,改成下载功能

        .onClick(() => {

          this.rawToFile(fileNameArr[0])

        })

      Button(‘2、沙箱word文件保存到手机文件管理’)

        .onClick(() => {

          this.save()//保存后请打开文件管理,保存的文档就在刚刚选中的目录下

        })

      Button(‘3、拉起文件,返回uri’)

        .onClick(() => {

          this.findPngUri()//拉起查看,返回地址

        })

    }

  }

  rawToFile(fileName: string) {

    context.resourceManager.getRawFileContent(fileName, (_err, value) => {

      let myBuffer: ArrayBufferLike = value.buffer

      let filePath = context.filesDir + ‘/’ + fileName

      console.log(“rawToFile中filePath:” + filePath);

      let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

      let writeLen = fs.writeSync(file.fd, myBuffer);

      console.info(“写入数据和文件成功:” + writeLen);

      console.info(“沙箱名称是:” + fileName);

      fs.closeSync(file);

    });

  }

  save() {

    console.log(‘fileNameArr:’ + fileNameArr)

    const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器保存选项实例

    documentSaveOptions.newFileNames = fileNameArr; // 保存文件名(可选)

    const documentViewPicker = new picker.DocumentViewPicker;

    documentViewPicker.save(documentSaveOptions)

      .then((documentSaveResult) => {

        // 获取到到图片或者视频文件的URI后进行文件读取等操作

        console.info('documentSaveResult.save successfully, audioSaveResult uri: ’ + JSON.stringify(documentSaveResult))

        let filePath = ‘’

        let uri = ‘’

        for (let index = 0; index < documentSaveResult.length; index++) {

          uri = documentSaveResult[index]

          console.log(uri${index}:${uri})

          filePath = context.filesDir + ‘/’ + fileNameArr[index]

          console.log(‘循环filePath:’ + filePath)

          // 沙箱路径文件

          let sanFile = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)

          let pubFile = fs.openSync(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)

          // 将文件从沙箱路拷贝到公共路径

          fs.copyFileSync(sanFile.fd, pubFile.fd)

          fs.closeSync(sanFile)

          fs.closeSync(pubFile)

        }

      })

      .catch((err: Error) => {

        console.error(Invoke documentPicker.select failed, message is ${err.message});

      })

  }

  findPngUri() {

    try {

      let documentSelectOptions = new picker.DocumentSelectOptions();

      let documentPicker = new picker.DocumentViewPicker(context);

      documentPicker.select(documentSelectOptions).then((documentSelectResult: Array<string>) => {

        console.info('DocumentViewPicker.select successfully, documentSelectResult uri: ’ +

        JSON.stringify(documentSelectResult));

        let uri = documentSelectResult[0]

        console.log(‘图片的uri地址是:’ + uri)

      }).catch((err: BusinessError) => {

        console.error('DocumentViewPicker.select failed with err: ’ + JSON.stringify(err));

      });

    } catch (error) {

      let err: BusinessError = error as BusinessError;

      console.error('DocumentViewPicker failed with err: ’ + JSON.stringify(err));

    }

  }

}

在HarmonyOS 鸿蒙Next中,实现下载按钮及文件管理按钮的方案如下:

下载按钮实现

  1. 按钮设置:在HML文件中设置下载按钮,并为其添加点击事件。
  2. 下载逻辑:在JS文件中实现下载逻辑,使用网络请求库(如鸿蒙自带的网络请求能力)下载文件,并保存到本地指定目录。
  3. 权限处理:确保应用已申请并获得了存储权限(如ohos.permission.WRITE_EXTERNAL_STORAGE)和互联网权限(ohos.permission.INTERNET)。

文件管理按钮实现

  1. 按钮设置:在HML文件中设置文件管理按钮,并为其添加点击事件。
  2. 调用系统文件管理器:在点击事件中,调用鸿蒙系统提供的文件管理器API,打开系统文件管理器并定位到下载目录,使用户能够找到刚下载的文件。

注意事项

  • 确保目录存在,否则在保存文件时需先创建目录。
  • 添加必要的异常处理逻辑,以应对网络中断、存储不足等可能的异常情况。

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

回到顶部