cordova-plugin-file覆盖window.File,上传文件为空的问题求助
解决cordova-plugin-file上传空文件的问题
这种问题我之前帮不少开发者排查过,核心原因大多和cordova-plugin-file的文件处理逻辑、以及它对原生window.File的覆盖有关,咱们一步步拆解可能的原因和解决办法:
1. 文件路径解析错误,未转换成可上传的二进制对象
cordova的文件系统使用cdvfile://这类自定义协议路径,直接把这个路径传给FormData的话,服务器根本没法正确解析文件内容。你需要先将cordova的文件路径转换成原生的Blob或File对象:
// 假设你拿到的cordova文件路径是filePath window.resolveLocalFileSystemURL(filePath, function(fileEntry) { // 获取File对象 fileEntry.file(function(file) { var reader = new FileReader(); reader.onloadend = function(e) { // 用读取到的二进制数据构造Blob var uploadBlob = new Blob([e.target.result], { type: file.type }); // 构造FormData并上传 var formData = new FormData(); // 这里append的是Blob,确保服务器能正确识别 formData.append('file', uploadBlob, file.name); // 发起POST请求上传 fetch('你的上传接口', { method: 'POST', body: formData }).then(res => { console.log('上传成功'); }).catch(err => { console.error('上传失败', err); }); }; // 以ArrayBuffer形式读取文件,保证二进制数据完整 reader.readAsArrayBuffer(file); }); }, function(err) { console.error('解析文件路径失败', err); });
2. window.File被覆盖导致构造异常
cordova-plugin-file会替换原生的window.File构造函数,如果你手动用new File()构造文件对象,可能因为插件实现的差异导致数据丢失。这时候优先用Blob来构造上传对象就可以避开这个问题,就像上面代码里那样。
3. FormData的append方式不正确
不要直接把cordova返回的FileEntry或者插件覆盖后的File对象append到FormData里,这类对象和原生web环境的File对象结构不同,无法被正确序列化。必须确保传入的是原生Blob/File对象,或者经过FileReader读取后的二进制数据。
4. 平台文件权限缺失
- Android:需要在
AndroidManifest.xml中添加文件读取权限(Android 13+需要READ_MEDIA_IMAGES等细分权限); - iOS:需要在
Info.plist中配置NSPhotoLibraryUsageDescription等权限描述,否则App无法读取文件内容,自然上传空文件。
5. 文件未读取完成就发起上传
文件读取是异步操作,一定要等FileReader的loadend事件触发后再构造FormData并发起请求。如果在读取完成前就上传,二进制数据还没加载,上传的自然是空文件。
内容的提问来源于stack exchange,提问作者enguerran
相关产品推荐
相关产品推荐

