HarmonyOS 用户从APP下载文件到Download目录,正确的流程是?以及需要的权限如何添加?

官网示例如下:

function writeUserDownloadDirExample() {
  // 检查是否具有 READ_WRITE_DOWNLOAD_DIRECTORY 权限,无权限则需要向用户申请授予权限。
  try {
    // 获取 Download 目录
    const downloadPath = Environment.getUserDownloadDir();
    console.info(`success to getUserDownloadDir: ${downloadPath}`);
    // 保存 temp.txt 到 Download 目录下
    const file = fs.openSync(`${downloadPath}/temp.txt`, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
    fs.writeSync(file.fd, 'write a message');
    fs.closeSync(file);
  } catch (error) {
    const err: BusinessError = error as BusinessError;
    console.error(`Error code: ${err.code}, message: ${err.message}`);
  }
}

如果现在是一个二进制文件,比如zip压缩包、PDF文件,应该如何保存到Download目录。

阅读 578
1 个回答

示例参考如下:

import { common } from '@kit.AbilityKit';
import { BusinessError, request } from '@kit.BasicServicesKit';
import { picker } from '@kit.CoreFileKit';
import fs from '@ohos.file.fs'

let url =
  'xxx.docx'
let url1 = 'xxx.png'

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  copyToDownload() {
    let context = getContext() as common.UIAbilityContext;
    let filesDir = context.filesDir;
    let date = new Date();
    let failCallback1 = (err: number) => {
      console.error(`Failed to download the task. Code: ${err}`);
    };
    let fileName = date.getTime() + '.' + 'png'
    let filePath = filesDir + '/' + fileName
    try {
      request.downloadFile(context, {
        url: url1,
        filePath: filePath
      }).then((downloadTask: request.DownloadTask) => {
        downloadTask.on('fail', failCallback1);

        downloadTask.on('complete', () => {
          console.info('download complete');
          let documentSaveOptions = new picker.DocumentSaveOptions();
          documentSaveOptions.newFileNames = [fileName];
          let documentPicker = new picker.DocumentViewPicker();
          documentPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => {
            let uri = documentSaveResult[0];
            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)
            console.info('DocumentViewPicker.save successfully, DocumentSaveResult uri: ' +
            JSON.stringify(documentSaveResult));
          }).catch((err: BusinessError) => {
            console.error('DocumentViewPicker.save failed with err: ' + JSON.stringify(err));
          });
        })
      }).catch((err: BusinessError) => {
        console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
      });
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(`Invoke downloadFile failed, code is ${err.code}, message is ${err.message}`);
    }
  }
  build() {
    RelativeContainer() {
      Text(this.message)
        .id('HelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.copyToDownload()
        })
    }
    .height('100%')
    .width('100%')
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进