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
相关产品推荐
相关产品推荐

