从Cordova应用程序上传文件到服务器时,我遇到了一个非常奇怪的现象 .
我的应用程序允许用户使用navigator.camera.getPicture选择2张图像(来自相册/相机),然后检索Camera.DestinationType.FILE_URI,后来用于通过FileTransfer插件上传,按顺序将文件发送到服务器 .
现在,奇怪的问题是,5-10%的时间,我们的Android应用程序用户上传的2张照片最终以第二张照片为止 . 这意味着,在用户选择了照片1和2并且上传了两者之后,服务器端接收到的图像都是照片2 .
我们尝试尽可能多地询问用户的信息,然后我们将其缩小到Android的问题(在iOS上完美运行) . 这很可能不是连接问题,因为无论是在Wifi还是3G上,用户都有这个问题,而且我们不确定它是否是内存问题,因为一些较新的模型也遇到了这个问题 .
我们尝试了很多次但是无法用我们的Android设备复制这个问题(包括较慢的旧设备) .
是否有人遇到过这样一个奇怪的问题,这是Camera插件或文件传输插件的问题吗?我怀疑它与内存问题有关,在上传之前应用程序以某种方式丢失或混淆了文件URI .
问题只发生在一种方式 - 就像两张照片变成了照片2,但从来没有成为照片1 .
请指教,谢谢!
[UPDATE]
在显示getPicture传递的FILE_URI值时,我注意到一个奇怪的现象 . 如果我再次为第二个图像调用getPicture,则插件使用的缓存文件保持不变 . 它始终是“file:///storage/sdcard0/Android/data/com.myapp/cache/modified.jpg?242432424”(结束数字是随机的,但它始终是“modified.jpg”文件名) .
这导致第二图像覆盖第一图像 . 但是,我还没有弄清楚应用程序大多数时间成功上传2个单独的图像而不是相同的副本 .
这是一个插件错误,总是使用与缓存图像相同的文件名,并且它是否与某些手机内存问题有关?有没有办法让它使用随机文件名,而不是只是将随机参数附加到同一个文件?
我的Android是4.3.1,运行Cordova 3.6 .
下面是我正在使用的getPicture代码:
navigator.camera.getPicture(function(imageData) { uploadPhoto(imageData) }, onCameraFail, {
destinationType: Camera.DestinationType.FILE_URI, sourceType : Camera.PictureSourceType.PHOTOLIBRARY, allowEdit: false, correctOrientation: true, saveToPhotoAlbum: false, targetWidth: 1280, targetHeight: 960
});
5 回答
显然这是Cordova的Camera插件的一个错误 . 如果你用一些修改参数调用getPicture,比如更改宽度或高度,插件会自动创建一个新的图像文件,但是......创建的文件通常被称为“modified.jpg” .
因此,在同一个实例中,如果我有两个或多个带有图像修改参数的getPicture调用,则所有后续图像都存储在Cordova缓存文件夹中的相同名称下,从而覆盖了之前的图像 .
似乎无法设置修改后的图像的文件名 . 我做的解决方法是不调整其中一个图像,因此保留了原始系统图像文件名 . 我最初使用两个图像的大小调整来减少上传时间和所需的带宽 .
希望Cordova在后续版本中修复Camera插件问题 .
相机插件的2.1.0版已经解决了这个bug . 该补丁于2015年10月16日应用 .
升级插件至少解决了我的案例中的错误 .
我一直在处理同样的问题 . 问题与cordova-camera-plugin没有返回真正的路径有关 . 相反,它返回缓存的修改文件的路径 . 在尝试了所有的解决方案,包括修改CameraLauncher.java和FileHelper.java之后,我最终使用完全不同的插件(https://github.com/wymsee/cordova-imagePicker)从库中选择图像,同时严格地使用cordova-camera-plugin相机 .
这个插件很好地解决了缓存的路径问题,最重要的是,用户可以选择1到多个图像,并在用户选择图像时为用户提供更好的体验 .
我一直有同样的问题,并密切关注这个问题,这使我想到了一个可能的解决方案 .
有一个修复等待添加 . 这是详细信息https://github.com/apache/cordova-plugin-camera/pull/99的链接 . 查看文件更改选项卡中的更改 .
作为一种解决方法,我会在选择图像后立即上传图像,因此本地名称是否相同并不重要 . 我通过php创建文件名功能 .
就可用性而言,这实际上改善了选择多个图像的过程,因为用户仅等待一小部分图像上载 . 我发生上传时禁用图像选择按钮以停止重复发生 .
我解决了以下问题,我帮助了=)
1 - 找到文件:path-to-your-app / platforms / android / src / org / apache / cordova / camera / CameraLauncher.java
2 - 导入文件顶部的类:
3 - 搜索“modified.jpg”并替换为: