uni-app plus.io 文件拷贝操作后,文件系统报错无法找到拷贝后的文件。

uni-app plus.io 文件拷贝操作后,文件系统报错无法找到拷贝后的文件。

开发环境 版本号 项目创建方式
Windows Windows 7 专业版 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:3.1.18

手机系统:iOS

手机系统版本号:IOS 14

手机厂商:苹果

手机机型:iPhone 8 Plus

页面类型:vue

打包方式:云端

示例代码:

function copyFile(fileCopyInfo) {
    //console.log("fileFrom:" + fileCopyInfo.fileFrom  );
    plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
        fs.root.getFile(fileCopyInfo.fileFrom, {create: false}, function(fileEntry) {
            fs.root.getDirectory("uniapp_save", {create: true, exclusive: false}, function(fileEntry1) {
                fileEntry.copyTo(fileEntry1, "123.pdf", function(entry) {
                    typeof fileCopyInfo.success == "function" && fileCopyInfo.success();
                }, e => {
                    typeof fileCopyInfo.faild == "function" && fileCopyInfo.faild(e);
                });
            }, e => {
                typeof fileCopyInfo.faild == "function" && fileCopyInfo.faild(e);
            });
        }, e => {
            typeof fileCopyInfo.faild == "function" && fileCopyInfo.faild(e);
        });
    }, e => {
        typeof fileCopyInfo.faild == "function" && fileCopyInfo.faild(e);
    });
}
  1. 使用该函数打开已拷贝好的文件B, 该函数存在于 fileCopyInfo结构success回调中执行, PDF文件被直接打开
uni.openDocument({
    filePath: "_doc/uniapp_save/123.pdf"
    fail: () => {
        uni.showToast({
            title: "文件打开失败",
            duration: 2000
        });
    }
});

操作步骤:

使用示例中的代码编译执行即可复现结果。

预期结果:

拷贝后的 PDF文件被直接打开显示

实际结果:

文件无法找到。

bug描述:

利用 plus.io 相关函数拷贝一个文件后,使用 iOS 自带的 uni.openDocument 打开PDF文件,报错无法找到该文件

使用 HB 3.1.18 + win7 平台调试,存在该问题,使用HB 3.1.13 + MAC 系统调试,没有发现该问题。


更多关于uni-app plus.io 文件拷贝操作后,文件系统报错无法找到拷贝后的文件。的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app plus.io 文件拷贝操作后,文件系统报错无法找到拷贝后的文件。的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个典型的iOS平台文件路径访问问题。在uni-app中,iOS平台对文件系统的访问路径处理与Android存在差异。

问题分析:

  1. plus.io.PRIVATE_DOC 对应的是应用私有文档目录,在iOS上实际路径与_doc前缀不完全匹配
  2. 文件拷贝成功后,使用_doc/uniapp_save/123.pdf路径访问可能无法正确定位到实际存储位置

解决方案:

修改文件打开代码,使用以下方式获取正确的文件路径:

// 在拷贝成功的回调中获取entry的完整路径
fileEntry.copyTo(fileEntry1, "123.pdf", function(entry) {
    // 使用entry.toURL()获取完整文件URL
    const fileURL = entry.toURL();
    
    uni.openDocument({
        filePath: fileURL,
        fail: () => {
            uni.showToast({
                title: "文件打开失败",
                duration: 2000
            });
        }
    });
    
    typeof fileCopyInfo.success == "function" && fileCopyInfo.success();
}, e => {
    typeof fileCopyInfo.faild == "function" && fileCopyInfo.faild(e);
});

或者使用plus.io.convertLocalFileSystemURL转换路径:

const convertedPath = plus.io.convertLocalFileSystemURL("_doc/uniapp_save/123.pdf");
uni.openDocument({
    filePath: convertedPath,
    fail: () => {
        // 错误处理
    }
});
回到顶部