uni-app 使用uni.downloadFile方法下载后用uni.openDocument方法报错找不到文件

uni-app 使用uni.downloadFile方法下载后用uni.openDocument方法报错找不到文件

项目属性 详细信息
产品分类 uniapp/App
PC开发环境操作系统 Mac
PC开发环境操作系统版本号 11.5.2
HBuilderX类型 正式
HBuilderX版本号 3.2.3
手机系统 iOS
手机系统版本号 iOS 12.4
手机厂商 苹果
手机机型 iphone6p
页面类型 vue
打包方式 离线
项目创建方式 HBuilderX

示例代码:

downloadImage(item) {  
    uni.downloadFile({  
        url: 'http://localhost:40003/file/service-file/download/'+item.fileStorageNo,  
        success: function (res) {  
            var filePath = res.tempFilePath;  
            uni.showModal({  
                title:filePath,  
            });  
            console.log(filePath)  
            uni.openDocument({  
                filePath:filePath,  
                fileType:"pdf",  
                success: function (res) {  
                    uni.hideLoading();  
                    this.downloadFile_onoff = true;  
                    console.log('打开文档成功');  
                },  
                fail(err){  
                    uni.showModal({  
                        title:err.errMsg,  
                    });  
                    uni.hideLoading();  
                    this.downloadFile_onoff = true;  
                }   
            });  
        }  
    })  
},

操作步骤:

点击文件进行查看,先输出文件地址,执行uni.openDocument方法时提示找不到文件

预期结果:

打开文件并预览

实际结果:

提示错误信息


更多关于uni-app 使用uni.downloadFile方法下载后用uni.openDocument方法报错找不到文件的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

问题已解决,由于后台业务需求需要将文件放在生成的文件夹中并且文件名称需要使用文件夹名称 + ‘—’ + 文件名使用,ios中的uni.openDocument 方法不能识别下划线导致文件读取失败。 解决办法建议:使用ngix配置,将文件访问地址配置成一个外网可以访问的地址再进行下载并打开。
var filePath = res.tempFilePath;
//处理filepath拼接成新的下载地址进行下载
var fileName = filePath.substring(filePath.lastIndexOf("/")+1);
//截取名称前面的文件夹位置
var fileName2 = fileName.substring(0,10);
console.log(‘拼接地址’);
console.log(fileName);
console.log(fileName2);
var url2 = ‘http://localhost:9999/’ + fileName2 + ‘/’+ fileName;
that.openDownLoad(url2);
openDownLoad(url){ console.log(url); uni.downloadFile({
url:url,
success: function(res){

                 //打开新地址下载的文件  
                 uni.openDocument({  
                   filePath:res.tempFilePath,  
                   fileType:"pdf",  
                   success: function (res) {  
                        console.log(res);  
                        console.log('打开文档成功');  
                   },  
                   fail:function(err){  
                        console.log(err);  
                        console.log('打开文档失败');  
                   }   
                 });  
             }  
         });  
    },<br>

更多关于uni-app 使用uni.downloadFile方法下载后用uni.openDocument方法报错找不到文件的实战教程也可以访问 https://www.itying.com/category-93-b0.html


可以让后端在命名时 规范统一一下

这个问题通常是由于文件路径处理不当导致的。从你的代码和截图来看,uni.downloadFile 下载成功并返回了临时文件路径,但 uni.openDocument 无法找到该文件。以下是可能的原因和解决方案:

  1. 临时文件路径问题:在 iOS 上,uni.downloadFile 下载的文件存储在临时目录中,而 uni.openDocument 可能无法直接访问该路径。建议将文件保存到持久化目录,例如 uni.saveFile 保存后再打开。

  2. 文件类型匹配:确保 fileType 参数与实际文件类型一致。虽然你指定为 "pdf",但下载的文件可能不是 PDF 格式,或者文件扩展名缺失。可以在下载后检查文件格式。

  3. 路径格式处理res.tempFilePath 返回的路径可能包含特殊字符或编码问题。尝试对路径进行解码或格式化处理,例如使用 decodeURIComponent()

  4. 异步处理问题:确保 uni.openDocument 在文件完全下载并保存后再执行。虽然你的代码在 success 回调中直接调用,但某些情况下文件可能未完全写入。可以添加延迟或使用 uni.saveFile 确保文件就绪。

  5. iOS 权限限制:iOS 对文件访问有沙盒限制,临时文件可能被系统清理。建议使用 uni.saveFile 将文件保存到应用文档目录,再使用返回的持久化路径打开。

修改建议:

downloadImage(item) {  
    uni.downloadFile({  
        url: 'http://localhost:40003/file/service-file/download/' + item.fileStorageNo,  
        success: function (res) {  
            var tempFilePath = res.tempFilePath;  
            uni.saveFile({  
                tempFilePath: tempFilePath,  
                success: function (saveRes) {  
                    var savedFilePath = saveRes.savedFilePath;  
                    uni.openDocument({  
                        filePath: savedFilePath,  
                        fileType: "pdf",  
                        success: function () {  
                            console.log('打开文档成功');  
                        },  
                        fail: function (err) {  
                            uni.showModal({  
                                title: '打开失败:' + err.errMsg  
                            });  
                        }  
                    });  
                },  
                fail: function (saveErr) {  
                    uni.showModal({  
                        title: '保存失败:' + saveErr.errMsg  
                    });  
                }  
            });  
        },  
        fail: function (downloadErr) {  
            uni.showModal({  
                title: '下载失败:' + downloadErr.errMsg  
            });  
        }  
    });  
}
回到顶部