Cordova iOS应用照片上传失败 Xcode提示图片文件不存在错误
Cordova iOS 图片加载与上传失败解决方案
从报错日志可以定位到核心问题:Cordova iOS 6.0+ 版本默认使用WKWebView,相机返回的FILE_URI是带http://localhost:端口/local-filesystem前缀的虚拟路径,FileTransfer插件无法识别该路径读取真实本地文件,导致文件找不到和上传失败。
修复步骤
- 路径预处理:拿到相机返回的imageData后,先过滤掉虚拟路径前缀,提取真实沙盒文件路径
示例处理逻辑:// 新增路径处理代码 if (imageData.indexOf('local-filesystem/') > -1) { imageData = imageData.split('local-filesystem')[1]; } - 调整上传配置:关闭分块上传模式,多数PHP服务端默认不支持分块上传,容易触发接收失败
修改FileUploadOptions配置:options.chunkedMode = false; - 可选兼容优化:如果适配iOS 14及以上系统,可以将相机参数中的
destinationType改为Camera.DestinationType.NATIVE_URI,直接返回原生文件路径,避免虚拟路径转换问题。
修改后的完整代码示例
$(document).on('tap', '#scatta_foto1', function(event) { event.preventDefault(); if (app.isJQMGhostClick(event)) { return; } navigator.camera.getPicture(function(imageData) { // 新增路径处理 if (imageData.indexOf('local-filesystem/') > -1) { imageData = imageData.split('local-filesystem')[1]; } var options = new FileUploadOptions(); options.fileKey = "file"; options.fileName = imageData.substr(imageData.lastIndexOf('/') + 1); options.mimeType = "image/jpg"; // 关闭分块上传 options.chunkedMode = false; app.setV('immagine1', options.fileName); app.setV('img1_salv', options.fileName); var ft = new FileTransfer(); ft.upload(imageData, encodeURI(app.getV('root') + 'upload_foto.php'), function win(r) { $('#immagine1').attr('src', encodeURI(app.getV('root_img') + options.fileName)); $('.foto1').show(); }, function fail(error) { alert('Image: ' + imageData + 'Failed because: ' + error.code + ' source: ' + error.source+ ' target: ' + error.target + ' status: ' + error.status + ' body: ' + error.body + ' exception: ' + error.exception); }, options, true); }, function(message) { }, { quality : 50, encodingType : Camera.EncodingType.JPG, destinationType : Camera.DestinationType.FILE_URI, sourceType : navigator.camera.PictureSourceType.PHOTOLIBRARY }); event.stopImmediatePropagation(); });
内容的提问来源于stack exchange,提问作者Vito Di Gravina
相关产品推荐
相关产品推荐

