在将文件从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" filename)。
这导致第二个图像覆盖第一个图像。但是,我还没有弄清楚应用程序成功上传2个单独的图像而不是相同的副本的大部分时间。
这是一个插件错误,总是使用与缓存图像相同的文件名,是否与某些手机内存问题有关?有没有办法让它使用随机文件名,而不是只是将随机参数附加到同一个文件?
我的Android是4.3.1,运行Cordova 3.6。
以下是我正在使用的getPicture代码:
// $next_page_link = $match;
$next_page_link = html_entity_decode($match);
答案 0 :(得分:3)
我一直在处理同样的问题。问题与cordova-camera-plugin没有返回真正的路径有关。相反,它返回缓存的修改文件的路径。在尝试了所有解决方案之后,包括修改了CameraLauncher.java和FileHelper.java,我最终使用了一个完全不同的插件(https://github.com/wymsee/cordova-imagePicker),用于在使用cordova-camera时从库中选择图像插件严格只适用于相机。
这个插件很好地解决了缓存路径问题,最重要的是,用户可以选择1到多个图像,并在用户选择图像时为用户提供更好的体验。
答案 1 :(得分:2)
相机插件的2.1.0版本已经解决了这个bug。 该补丁于2015年10月16日应用。
升级插件至少解决了我的问题。
答案 2 :(得分:1)
显然这是Cordova的Camera插件的一个错误。如果你用一些修改参数调用getPicture,比如更改宽度或高度,插件会自动创建一个新的图像文件,但是...创建的文件通常被称为“modified.jpg”。
因此,在同一个实例中,如果我有两个或更多带有图像修改参数的getPicture调用,则所有后续图像都存储在Cordova缓存文件夹中的相同名称下,从而覆盖了之前的图像。
似乎无法设置修改后的图像的文件名。我做的解决方法是不调整其中一个图像,因此保留了原始系统图像文件名。我最初使用两个图像的大小调整来减少上传时间和所需的带宽。
希望Cordova在后续版本中修复Camera插件问题。
答案 3 :(得分:1)
我一直有同样的问题,并密切关注这个问题,这使我想到了一个可能的解决方案。
有一个等待添加的修复程序。以下是详细信息https://github.com/apache/cordova-plugin-camera/pull/99的链接。请参阅文件更改选项卡中的更改。
作为一种解决方法,我会在选择图像后立即上传图像,因此如果本地名称相同则无关紧要。我通过php函数创建文件名。
就可用性而言,这实际上改善了选择多个图像的过程,因为用户仅等待一小部分图像上传。我发生上传时禁用图像选择按钮以停止重复发生。
答案 4 :(得分:1)
我解决了以下问题,我帮助了=)
1 - 找到文件:path-to-your-app / platforms / android / src / org / apache / cordova / camera / CameraLauncher.java
2 - 导入文件顶部的类:
import java.security.SecureRandom;
import java.math.BigInteger;
3 - 搜索“modified.jpg”并替换为:
String randomName = new BigInteger(130, new SecureRandom()).toString(32);
String modifiedPath = getTempDirectoryPath() + "/" + randomName + "_modified.jpg";