uni-app 使用 uni.saveFile 保存文件时安卓成功 iOS失败

uni-app 使用 uni.saveFile 保存文件时安卓成功 iOS失败

开发环境 版本号 项目创建方式
Windows 10 HBuilderX
iOS IOS 14

示例代码:

var downloadTask = uni.downloadFile({
url:url,
success: (res) => {
let that = this;
var tempFilePath = res.tempFilePath;
var nowEno = uni.getSystemInfoSync().platform;
if(nowEno == 'ios'){
tempFilePath = escape(tempFilePath)
}
console.log(tempFilePath)
uni.saveFile({
tempFilePath: tempFilePath,
success: (res) => {
cons ole.log(res.savedFilePath)
},
fail: (res) => {
console.log(res)
}
})
},
fail: (res) => {
console.log(res)
}

操作步骤:

var downloadTask = uni.downloadFile({
url:url,
success: (res) => {
let that = this;
var tempFilePath = res.tempFilePath;
var nowEno = uni.getSystemInfoSync().platform;
if(nowEno == 'ios'){
tempFilePath = escape(tempFilePath)
}
console.log(tempFilePath)
uni.saveFile({
tempFilePath: tempFilePath,
success: (res) => {
cons ole.log(res.savedFilePath)
},
fail: (res) => {
console.log(res)
}
})
},
fail: (res) => {
console.log(res)
}

预期结果:

能够正常获取到保存后的值

实际结果:

无法保存,报错

bug描述:

下载的文件有中文,在安卓系统下载正常,ios系统上如果没有编码提示文件找不到,编码后提示编码错误。


更多关于uni-app 使用 uni.saveFile 保存文件时安卓成功 iOS失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

我也遇到这个问题了,有其他的解决办法吗

更多关于uni-app 使用 uni.saveFile 保存文件时安卓成功 iOS失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html


仅中文名称的文件出现问题吗?

是的,安卓中英文都可以,ios上文件中如果带中文就不行,不带中文能够正常下载保存

已解决,ios状态下执行h5+,代码如下:
plus.io.resolveLocalFileSystemURL(tempFilePath,(srcEntry)=>{ plus.io.resolveLocalFileSystemURL("_doc",(dstEntry)=>{ dstEntry.getDirectory(“uniapp_save”,{create:true,exclusive:false},(saveEntry)=>{ //console.log(“srcEntry.toURL”,srcEntry.toURL()) //console.log(“dstEntry.toURL”,dstEntry.toURL()) //console.log(“saveEntry.toURL”,saveEntry.toURL()) let fnames = srcEntry.name.split("."); let fileName = Buffer.from(fnames[0]).toString(‘hex’)+(fnames[1]?(’.’+fnames[1]):’’); //console.log(“fileName”,fileName) srcEntry.moveTo(saveEntry,fileName,(res)=>{ const savedFilePath = res.toURL() console.log(“savedFilePath”,savedFilePath) uni.setStorage({ key: key, data: savedFilePath }) complete && complete(savedFilePath) }); }) },(err)=>{ console.error(err); }) });

3.1.17.20210608 版本已经解决

在iOS系统中,uni.saveFile对文件路径的处理与Android存在差异。你的代码中对iOS路径使用escape()编码是不必要的,这会导致路径被错误转换,引发文件找不到或编码错误。

问题核心在于iOS系统对文件路径中的特殊字符(如中文)处理更严格。uni.downloadFile返回的临时路径本身是有效的,直接传递给uni.saveFile即可,无需额外编码。

修正代码:

uni.downloadFile({
  url: url,
  success: (res) => {
    if (res.statusCode === 200) {
      uni.saveFile({
        tempFilePath: res.tempFilePath, // 直接使用原始路径
        success: (savedRes) => {
          console.log('文件保存成功:', savedRes.savedFilePath);
        },
        fail: (err) => {
          console.log('保存失败:', err);
        }
      });
    }
  },
  fail: (err) => {
    console.log('下载失败:', err);
  }
});
回到顶部