HarmonyOS 鸿蒙Next 下载pdf文件并保存到用户文件目录

发布于 1周前 作者 gougou168 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 下载pdf文件并保存到用户文件目录

我想要实现一个pdf预览,我是通过request下载文件到沙箱环境,再使用webview打开沙箱环境中的文件,我还需要实现将文件保存到用户目录下,我是用文件选择器保存后文件是0b,也无法打开文件,有大佬知道咋弄不

2 回复

可以参考下demo

import { BusinessError, request } from '[@kit](/user/kit).BasicServicesKit';
import picker from '[@ohos](/user/ohos).file.picker';
import fs from '[@ohos](/user/ohos).file.fs';
import { common } from '[@kit](/user/kit).AbilityKit';
import { buffer } from '[@kit](/user/kit).ArkTS';
[@Entry](/user/Entry)
[@Component](/user/Component)
struct DocumentSave {
 [@State](/user/State) message: string = '下载文件';
 build() {
   RelativeContainer() {
     Text(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 context = getContext(this);
         const downloadUrl = '文件链接名.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', () => {
               //将文件复制到文件夹中
               const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器保存选项实例
               documentSaveOptions.newFileNames = ["aaa.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+ '/aa.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)
                   console.log("-------")
                 })
               console.log('下载完成')
             })}
             // 下载完成
           )
             .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文件并保存到用户文件目录的步骤如下:

  1. 请求权限:首先,应用需要申请必要的权限,包括网络访问权限(用于下载文件)和读写存储权限(用于保存文件)。在应用的manifest文件中添加相关权限声明。

  2. 创建下载任务:使用HarmonyOS提供的网络请求API(如ArkUI中的fetch API)发起对PDF文件URL的GET请求,以获取文件内容。

  3. 处理响应:下载完成后,将响应的二进制数据保存为PDF文件。可以使用系统提供的文件操作API(如ArkUI中的file模块)来实现文件的创建和写入。

  4. 保存到用户文件目录:将生成的PDF文件保存到应用专有的用户文件目录中。HarmonyOS提供了特定的API来访问和操作应用私有目录。

  5. 路径返回:下载并保存完成后,返回文件的保存路径给用户,或者在应用内显示该PDF文件。

示例代码(简化):

let url = "PDF文件URL";
fetch(url).then(response => response.blob()).then(blob => {
    let filePath = "/storage/emulated/0/YourAppDir/filename.pdf";
    file.writeFile(filePath, blob);
});

请注意,实际代码中需要处理错误情况,并根据需求调整文件路径和文件名。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部