HarmonyOS 鸿蒙Next中FilePreview使用

HarmonyOS 鸿蒙Next中FilePreview使用 在HarmonyOS应用开发中,经常需要实现各种文件的预览功能,包括:

  1. 本地存储的文件预览。
  2. 应用资源目录(rawfile)中的文件预览。
  3. 网络文件的下载与预览。

如何利用HarmonyOS提供的FilePreview服务统一实现这些不同来源文件的预览?

3 回复

HarmoneyOS提供了FilePreview框架,这是一个用于文件预览的统一接口服务。它支持多种文件格式的预览,包括但不限于:

  • 文档类:pdf、doc、docx、ppt、pptx、xls、xlsx等。
  • 图片类:jpg、png、gif等。
  • 音频类:m4a、aac、mp3、ogg、wav等。
  • 视频类:mp4、mkv、ts等。
  • 其他常见格式。

FilePreview服务的主要优势在于:

  1. 统一的API接口。
  2. 支持多种文件来源。
  3. 内置多种文件格式解析能力。

解决方案

  1. 本地文件指存储在应用沙箱目录或公共目录中的文件,该类文件的预览可以参考官方文档:本地文件预览
previewLocalFile() {
  try {
    const filePath = `${this.context.filesDir}/sample.pdf`;
    // 检查文件是否存在
    const isExist = fs.accessSync(filePath);
    if (!isExist) {
      console.error('本地文件不存在,请确保文件已放置到应用目录');
      return;
    }
    // 构建PreviewInfo
    let uri = fileUri.getUriFromPath(filePath);
    let fileInfo: filePreview.PreviewInfo = {
      title: 'sample.pdf',
      uri: uri,
      mimeType: 'application/pdf',
    };
    // 打开文件预览
    filePreview.openPreview(this.context, fileInfo).then(() => {
      console.info('Succeeded in opening preview');
    }).catch((err: BusinessError) => {
      console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
    });
  } catch (error) {
    console.error(`预览rawfile文件失败: ${JSON.stringify(error)}`);
  }
}
  1. rawfile文件预览,当前API不支持直接预览rawFile文件,预览时需要先将rawfile导入至沙箱路径。
previewRawFile() {
  try {
    // 预览rawfile文件,需要将文件复制到沙箱目录
    let filePath = `${this.context.filesDir}/sample.pdf`;
    const resourceMgr = this.context.resourceManager;
    resourceMgr.getRawFileContent('sample.pdf', (err, value) => {
      let myBuffer: ArrayBufferLike = value.buffer;
      // 创建sample.pdf沙箱路径,并写入数据
      let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
      fs.writeSync(file.fd, myBuffer);
      fs.close(file);
    });
    let uri = fileUri.getUriFromPath(filePath);
    let fileInfo: filePreview.PreviewInfo = {
      title: 'sample.pdf',
      uri: uri,
      mimeType: 'application/pdf',
    };
    // 打开文件预览
    filePreview.openPreview(this.context, fileInfo).then(() => {
      console.info('Succeeded in opening preview');
    }).catch((err: BusinessError) => {
      console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
    });
  } catch (error) {
    console.error(`预览rawfile文件失败: ${JSON.stringify(error)}`);
  }
}
  1. 网络文件预览,与rawfile文件相同,文件预览服务FilePreview暂不支持在线预览,对于网络文件需要下载到本地之后进行本地文件预览。
previewNetworkFile() {
  // url需替换为实际可用的pdf url
  const url = 'https://****.com/test.pdf';
  let filePath = `${this.context.filesDir}/sample.pdf`;
  try {
    // 网络文件下载到本地
    let res = fs.accessSync(filePath);
    if (res) {
      // 本地文件存在,则直接调用预览方法
      console.info('file exists and ViewFile');
      let uri = fileUri.getUriFromPath(filePath);
      let fileInfo: filePreview.PreviewInfo = {
        title: 'sample.pdf',
        uri: uri,
        mimeType: 'application/pdf',
      };
      // 打开文件预览
      filePreview.openPreview(this.context, fileInfo).then(() => {
        console.info('Succeeded in opening preview');
      }).catch((err: BusinessError) => {
        console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
      });
    } else {
      // 文件下载到本地
      request.downloadFile(this.context, {
        url: url,
        filePath: filePath
      }).then((downloadTask: request.DownloadTask) => {
        // 下载完成回调
        downloadTask.on('complete', () => {
          console.info('download complete');
          let uri = fileUri.getUriFromPath(filePath);
          let fileInfo: filePreview.PreviewInfo = {
            title: 'sample.pdf',
            uri: uri,
            mimeType: 'application/pdf',
          };
          // 打开文件预览
          filePreview.openPreview(this.context, fileInfo).then(() => {
            console.info('Succeeded in opening preview');
          }).catch((err: BusinessError) => {
            console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
          });
        });
      }).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}`);
  }
}

总结

文件预览服务为文件预览提供了统一的解决方案:

统一接口:无论文件来源如何,都使用filepreview.openPreview()接口。

格式丰富:支持常见办公文档、图片、文本等格式。

权限管理:需要确保应用有相应文件的访问权限。

实际开发中应根据具体场景选择合适的预览方式,并处理好错误情况和用户权限问题。对于敏感文件,还应该增加额外的安全验证机制。

更多关于HarmonyOS 鸿蒙Next中FilePreview使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,FilePreview组件用于文件预览功能。它支持多种文件格式,包括图片、文档等,通过FilePreviewController进行控制。开发者可配置预览参数,如缩放比例和页面切换。该组件直接集成在ArkUI框架中,无需依赖Java或C语言。使用示例:在Page中引入组件,绑定控制器,设置文件路径即可实现预览。

在HarmonyOS Next中,FilePreview服务通过fileUri参数统一处理不同来源的文件预览。以下是具体实现方法:

  1. 本地文件预览
    使用fileio模块获取文件URI:

    let fileUri = 'file://' + context.filesDir + '/sample.pdf';
    FilePreview.preview({ fileUri: fileUri });
    
  2. rawfile资源文件预览
    通过ResourceManager获取资源路径:

    let rawfileUri = 'resource://rawfile/sample.pdf';
    FilePreview.preview({ fileUri: rawfileUri });
    
  3. 网络文件预览
    需先通过@ohos.request下载文件到本地,再使用本地URI预览:

    // 下载完成后获取本地缓存路径
    let downloadedUri = 'file://.../cache/sample.pdf';
    FilePreview.preview({ fileUri: downloadedUri });
    

关键点:

  • FilePreview自动识别文件类型(PDF、图片、文本等)
  • 网络文件需确保下载完成且具有有效本地路径
  • 支持通过startAbility传递预览参数实现跨应用调用
  • 系统会根据文件类型调用对应的预览应用

这种设计实现了不同文件源的统一预览接口,开发者无需关心具体文件解析逻辑。

回到顶部