Cordova Image Upload重复问题

时间:2015-05-25 12:32:05

标签: android cordova file-upload android-camera cordova-plugins

在将文件从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);

5 个答案:

答案 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";