You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ionic V1中通过File Transfer插件上传前获取iCloud文件大小遇iOS问题

解决Ionic V1 iOS端无法获取iCloud文件大小的问题

嘿,我明白你遇到的困扰——Android端能正常拿到文件大小,iOS端却不行,而且文件还能正常上传,这确实有点头疼。问题出在iOS对iCloud文件的特殊处理上,下面给你一步步拆解解决方案:

问题根源

iOS的iCloud文件很多时候是占位符文件:看起来有路径,但实际内容还在云端没下载到本地。这时候你调用fileEntry.file()拿到的fileObj.size要么是0,要么是占位符的大小,不是真实文件的大小。而Android没有这种云端占位符的机制,所以直接就能拿到正确大小。

解决方案:先把iCloud文件同步到本地再获取大小

我们需要先把iCloud文件复制到App的本地沙箱目录(比如documentsDirectory),这时候iOS会自动把云端的文件下载到本地,之后就能获取真实的文件大小了。修改你的代码如下:

// 定义常量
const MEGABYTE = 1024 * 1024;
const UPLOAD_LIMIT = 50; // 假设你的上传限制是50MB

window.resolveLocalFileSystemURL(Uri, function(fileEntry) {
  // 先尝试直接获取文件信息
  fileEntry.file(function(fileObj) {
    let size = fileObj.size;
    // 如果size异常(比如0或者远小于实际大小),走复制流程
    if (size <= 0) {
      handleICloudFileCopy(fileEntry);
      return;
    }
    
    let megaSize = size / MEGABYTE;
    let roundedSize = Math.round(megaSize * 10) / 10;
    console.log("roundedSize", roundedSize);
    
    if (roundedSize < UPLOAD_LIMIT) {
      // 你的上传逻辑
    } else {
      // 超出限制提示
    }
  }, function(fileError) {
    // 文件获取失败,大概率是iCloud占位符,走复制流程
    console.error("直接获取文件失败:", fileError);
    handleICloudFileCopy(fileEntry);
  });
}, function(error) {
  console.error("解析文件路径失败:", error);
});

// 处理iCloud文件复制到本地的函数
function handleICloudFileCopy(fileEntry) {
  // 获取App本地文档目录
  window.resolveLocalFileSystemURL(cordova.file.documentsDirectory, function(localDirEntry) {
    // 复制iCloud文件到本地目录
    fileEntry.copyTo(localDirEntry, fileEntry.name, function(copiedEntry) {
      // 从复制后的本地文件获取大小
      copiedEntry.file(function(copiedFileObj) {
        let size = copiedFileObj.size;
        let megaSize = size / MEGABYTE;
        let roundedSize = Math.round(megaSize * 10) / 10;
        console.log("本地复制文件的roundedSize:", roundedSize);
        
        // 这里可以用复制后的文件路径进行上传,或者继续你的逻辑
        if (roundedSize < UPLOAD_LIMIT) {
          // 用copiedEntry.toURL()作为上传路径
          // 你的上传逻辑
        } else {
          // 超出限制提示
        }
        
        // 可选:上传完成后删除本地复制的文件,节省空间
        copiedEntry.remove(function() {
          console.log("临时文件已删除");
        });
      }, function(copiedFileError) {
        console.error("获取复制后文件信息失败:", copiedFileError);
      });
    }, function(copyError) {
      console.error("复制iCloud文件失败:", copyError);
    });
  }, function(localDirError) {
    console.error("获取本地目录失败:", localDirError);
  });
}

额外注意事项

  • iCloud权限配置:确保你的iOS项目Info.plist里已经正确配置了iCloud容器权限,否则App无法访问iCloud文件。你需要添加NSUbiquitousContainers数组,配置对应的iCloud容器ID。
  • 插件版本:确保你使用的cordova-plugin-file是最新稳定版,旧版本可能对iCloud文件的支持不完善。
  • 用户体验:复制iCloud大文件时可能需要时间,建议添加加载提示,避免用户以为App卡住了。

这样修改后,iOS端就能正确获取iCloud文件的真实大小了,同时不影响Android端的正常功能。

内容的提问来源于stack exchange,提问作者Robin Joseph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:20:34