HarmonyOS鸿蒙Next中文件预览打印提示成功但显示预览失败,提示文件路径改变或文件名修改,如何不打开弹窗预览并指定预览位置?

HarmonyOS鸿蒙Next中文件预览打印提示成功但显示预览失败,提示文件路径改变或文件名修改,如何不打开弹窗预览并指定预览位置?

readWriteFile(srcFileString: string, destFileString: string, fileName: string): void {
  console.log(destFileString, 'wudibawanglong', fileName)
  let srcFile = fs.openSync(srcFileString, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  let destFile = fs.openSync(destFileString, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  let context = this.getContext() as common.UIAbilityContext;
  let mType: string = '';
  let bufSize = 4096;
  let readSize = 0;
  let buf = new ArrayBuffer(bufSize);
  let readOptions: ReadOptions = {
    offset: readSize,
    length: bufSize
  };
  let readLen = fs.readSync(srcFile.fd, buf, readOptions);
  let fileInfo: filePreview.PreviewInfo = {
    title: fileName,
    uri: destFileString,
    mimeType: mType
  };
  while (readLen > 0) {
    readSize += readLen;
    let writeOptions: WriteOptions = {
      length: readLen
    };
    fs.writeSync(destFile.fd, buf, writeOptions);
    readOptions.offset = readSize;
    readLen = fs.readSync(srcFile.fd, buf, readOptions);
  }
  filePreview.openPreview(context, fileInfo).then(() => {
    hilog.info(0x0000, TAG, 'openPreview success');
  }).catch((err: BusinessError) => {
    console.log(JSON.stringify(fileInfo), 'wudibawanglong')
    hilog.error(0x0000, TAG, 'openPreview failed, err = %s', err.message);
  });
}

更多关于HarmonyOS鸿蒙Next中文件预览打印提示成功但显示预览失败,提示文件路径改变或文件名修改,如何不打开弹窗预览并指定预览位置?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

暂时看到2处可能的错误。

直接使用沙箱路径destFileString作为uri可能导致预览失败,转换为合法的URI格式试一试

// 增加路径转换逻辑
import { fileUri } from '@kit.CoreFileKit';

let uri = fileUri.getUriFromPath(destFileString);
let fileInfo: filePreview.PreviewInfo = {
  title: fileName,
  uri: uri,  // 使用转换后的uri
  mimeType: mType
};

猜测代码中mType未赋值导致参数错误

// 根据文件后缀动态设置mimeType
let extension = fileName.split('.').pop();
switch(extension) {
  case 'txt': mType = 'text/plain'; break;
  case 'jpg': mType = 'image/jpeg'; break;
  case 'pdf': mType = 'application/pdf'; break;
}

更多关于HarmonyOS鸿蒙Next中文件预览打印提示成功但显示预览失败,提示文件路径改变或文件名修改,如何不打开弹窗预览并指定预览位置?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


能提供下可以复现问题的最小复现demo吗?还有具体的报错截图这些,关看这个方法看不出来是啥原因。

在HarmonyOS Next中,使用wantConstant.Flags.FLAG_ABILITY_CONTINUATION标志启动Ability时,可通过startAbilityparameters参数传递"ohos.ability.extra.PREVIEW_FILE_PATH"键值对指定固定预览路径。示例代码片段:

let wantInfo = {
    bundleName: "com.example.preview",
    abilityName: "MainAbility",
    parameters: {
        "ohos.ability.extra.PREVIEW_FILE_PATH": "/data/storage/el2/base/files/static_preview.pdf"
    },
    flags: wantConstant.Flags.FLAG_ABILITY_CONTINUATION
};
this.context.startAbility(wantInfo);

需确保目标文件路径具备可读权限且路径未被动态修改。

根据代码分析,问题可能出在文件路径处理或预览参数设置上。建议检查以下几点:

  1. 确保destFileString路径是应用沙箱内有效路径,使用getFilesDir()获取安全路径

  2. 文件复制完成后添加同步操作:

    fs.fsyncSync(destFile.fd);
    fs.closeSync(srcFile);
    fs.closeSync(destFile);
    
  3. 设置正确的mimeType:

    let mType = URL.createObjectURL(new Blob([])).type; 
    // 或根据文件扩展名设置具体类型
    
  4. 对于指定预览位置,目前HarmonyOS Next的filePreview.openPreview()是系统级弹窗,不支持自定义位置。如需内嵌预览,建议使用Web组件加载文件内容。

  5. 路径问题排查:

    console.log('Final path:', destFileString); 
    // 确认路径格式为"internal://app/..."或"file://..."
    

出现"文件路径改变"错误通常是由于临时文件被清理或路径权限问题导致。

回到顶部