HarmonyOS 鸿蒙Next中二进制的PDF文件保存问题

HarmonyOS 鸿蒙Next中二进制的PDF文件保存问题 二进制的PDF文件能保存文件到Download里吗?,如何把二进制的PDF文件保存到本地?

3 回复

【解决方案】

可以将二进制流如ArrayBuffer先保存到沙箱目录中,然后在保存到用户文件目录。

可以参考代码,这边已下载一个pdf为例,下载到沙箱后通过documentViewPicker保存到Download目录里:

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

const context = getContext(this);

@Entry
@Component
struct DocumentSave {
  @State message: string = '下载文件';

  build() {
    RelativeContainer() {
      Button('保存到用户目录').onClick(() => {
        let file = fs.openSync(context.filesDir + '/aa.pdf', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
        let fileb = fs.openSync(context.filesDir + '/bb.pdf', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
        let arrayBuffer = new ArrayBuffer(4096000);
        let readLen = fs.readSync(file.fd, arrayBuffer);
        let buf = buffer.from(arrayBuffer, 0, readLen);
        console.info(`content of File: ${buf.toString()}`);
        let writeLen = fs.writeSync(fileb.fd, arrayBuffer);
        //将文件复制到文件夹中
        const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器保存选项实例
        documentSaveOptions.newFileNames = ["bbb.pdf"]; // 保存文件名(可选)
        const documentViewPicker = new picker.DocumentViewPicker;
        documentViewPicker.save(documentSaveOptions).then(async (documentSaveResult) => {
          // 获取到到图片或者视频文件的URI后进行文件读取等操作
          let uri = documentSaveResult[0];
          console.info('pub uri:' + uri)
          // 沙箱路径文件
          let sanFile = fs.openSync(context.filesDir + '/bb.pdf', 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(pubFile.fd)
          fs.closeSync(fileb.fd)
          fs.closeSync(file);
          console.log("-------")
        })
      })
      Button(this.message)
        .id('DocumentSaveHelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .fontColor(Color.Pink)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          const downloadUrl =
            "https://xx/sample.pdf";
          try {
            request.downloadFile(context, {
              enableMetered: true,
              url: downloadUrl,
              filePath: context.filesDir + '/aa.pdf'
            }).then((downloadTask: request.DownloadTask) => {
              downloadTask.on('fail', (err: number) => {
                console.error(`Failed to download the task. Code: ${err}`);
              });
              downloadTask.on('progress', (receivedSize: number, totalSize: number) => {
                console.log('download', "receivedSize:" + (receivedSize / 1024) + " totalSize:" + (totalSize / 1024));
              });
              downloadTask.on('complete', () => {
                console.info('download complete');
                let file = fs.openSync(context.filesDir + '/aa.pdf', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
                let arrayBuffer = new ArrayBuffer(4096000);
                let readLen = fs.readSync(file.fd, arrayBuffer);
                let buf = buffer.from(arrayBuffer, 0, readLen);
                console.info(`content of File: ${buf.toString()}`);
                let writeLen = fs.writeSync(file.fd, arrayBuffer);
                fs.closeSync(file);
              })
            }
              // 下载完成
            )
              .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}`);
          }
        })
    }
    .height('100%')
    .width('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next中二进制的PDF文件保存问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,二进制PDF文件保存需使用@ohos.file.fs模块的API。通过fs.openSync()以二进制模式打开或创建文件,路径应使用应用沙箱目录。使用fs.writeSync()将包含PDF数据的ArrayBuffer写入文件句柄,操作完成后调用fs.closeSync()释放资源。需在module.json5中声明文件读写权限。

在HarmonyOS Next中,可以通过文件管理API将二进制PDF文件保存到Download目录。具体步骤如下:

  1. 使用@ohos.file.fs模块的fs.open方法创建或打开目标文件(路径可设为'Download/xxx.pdf')。
  2. 通过fs.write将二进制数据(如ArrayBuffer)写入文件。
  3. 调用fs.close关闭文件句柄。

示例代码片段:

import fs from '@ohos.file.fs';

let filePath = 'Download/example.pdf';
let binaryData; // 你的PDF二进制数据(ArrayBuffer类型)

fs.open(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE).then((file) => {
  fs.write(file.fd, binaryData).then(() => {
    fs.close(file.fd);
    console.log('PDF保存成功');
  });
});

注意:

  • 需在module.json5中申请ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA权限。
  • 文件路径需使用沙箱路径或公共目录访问方式(通过@ohos.file.fileuri转换)。
  • 二进制数据需确保格式正确,否则可能导致文件损坏。
回到顶部