2015-05-25 51 views
1

我在将文件从我的Cordova应用上传到服务器时遇到了一个非常奇怪的现象。Cordova图片上传重复问题

我的应用程序允许用户使用navigator.camera.getPicture选择2张图片(从相册/相机),然后检索Camera.DestinationType.FILE_URI,稍后用于通过FileTransfer插件上传,将文件发送到服务器按顺序。

现在,奇怪的问题是,5-10%的时间,由我们的Android应用程序用户上传的2张照片最终以BOTH作为第二张照片。这意味着,在用户选择了照片1和2并同时上传后,服务器端收到的照片都是照片2.

我们已经尝试询问用户尽可能多的信息,我们将其缩小到Android的问题(在iOS上完美运行)。这很可能不是连接问题,因为无论用户使用Wifi还是3G,用户都会遇到此问题,而且我们不确定是否存在内存问题,因为一些较新的型号也遇到了此问题。

我们尝试了很多次,但无法用我们的Android设备(包括较慢,较旧的设备)复制此问题。

有没有人遇到这样一个奇怪的问题,这是一个相机插件或文件传输插件的问题?我怀疑它与内存问题有关,在上传之前,应用程序以某种方式丢失或混淆了文件URI。

问题只发生一个办法 - 在两张照片成了照片2张,但从来都成为照片1.

请指教,谢谢!

[UPDATE]

我注意到在显示由Getpicture中传递的FILE_URI值的怪异现象。如果我再次为第二张图片调用getPicture,插件使用的缓存文件保持不变。它始终是“file:///storage/sdcard0/Android/data/com.myapp/cache/modified.jpg?242432424”(结尾的数字是随机的,但始终是“modified.jpg”文件名)。

这会导致第二张图像覆盖第一张图像。但是,我还没有弄清楚大多数时候应用程序是如何成功上传2张独立的图片而不是相同的副本的。

这是一个插件的bug,总是使用相同的文件名作为缓存的图像,并可能与某些手机内存问题有关?有什么办法可以让它使用随机文件名,而不是只是将随机参数附加到同一个文件中?

我的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 
     }); 
+0

这个问题可能在你的javascript代码中 - 也许你可以发布你上传的地方。 –

+0

我刚刚添加了Javascript代码,您可以请看一下吗?谢谢。 – Andy

+0

我刚发现这个奇怪的bug可能与Camera插件的getPicture有关,并且更新它来显示我的getPicture Javascript。谢谢。 – Andy

回答

2

相机插件的2.1.0版本已经解决了这个错误。 该补丁应用于2015年10月16日。

升级插件解决了我至少在这个错误中的错误。

+0

感谢您的更新,这非常棒! – Andy

1

显然,这是科尔多瓦的摄像头插件的错误。如果您使用一些修改参数(如更改宽度或高度)调用getPicture,插件会自动创建一个新的图像文件,但是...创建的文件通称为“modified.jpg”。因此,在同一个实例中,如果我有两个或多个带有图像修改参数的getPicture调用,所有后续图像都将以相同名称存储在Cordova的缓存文件夹中,从而覆盖较早的图像。

似乎无法设置修改后的图像的文件名。我所做的解决方法是不调整其中一个图像的大小,以便保留原始系统图像文件名。我最初使用两个图像的大小调整来减少上传时间和所需的带宽。

希望科尔多瓦修复后续版本中的相机插件问题。

1

我一直有同样的问题,并留意在这个问题,这指出我到一个可能的解决方案。

有一个修复正在等待添加。这里是详细的链接https://github.com/apache/cordova-plugin-camera/pull/99。查看文件已更改选项卡中的更改。

作为解决办法,我一上传图片,只要他们选择它,所以没关系,如果本地名称是相同的。我通过php函数创建文件名。

就可用性而言,这实际上改善了选择多个图像的过程,因为用户仅等待一小部分图像上传。当上传正在发生时,我禁用了图像选择按钮以停止重复发生。

+0

谢谢..你的回答理论上应该解决文件名问题,如果这是定义文件名的唯一位置。难道是先编译的插件类需要先清理? – Andy

+0

我已经看了一遍,它看起来像只有两个地方的文件名被设置时修改。我也注意到,我的文件名更改没有通过。即使我做出明显的改变,他们也不会发生。对不起,我忍不住。我迫切需要解决这个问题。 – Schreyers

+0

谢谢你的努力..也许你可以提交一个错误报告给相机插件的开发者?现在我暂时做了一个解决方法,我只调整两张照片中的一张,所以没有文件名冲突。 – Andy

3

我一直在处理同样的问题。这个问题与cordova-camera-plugin没有返回真实路径有关。相反,它会将路径返回到缓存的修改文件。在尝试了所有解决方案后,包括修改CameraLauncher.java和FileHelper.java,我最终使用完全不同的插件(https://github.com/wymsee/cordova-imagePicker)从库中选择图像,同时严格使用cordova-camera-plugin相机。

这个插件制定出相当不错,因为它解决了缓存路径问题,最重要的是,用户可以选择1至多个图像和android上的选择图像时,也呈现给用户更好的体验。

+0

感谢您的建议,我会尝试一下! – Andy

1

我解决了如下问题,我已经帮助=)

1 - 找到文件:路径到您的应用程序内/平台/安卓/ SRC /组织/阿帕奇/科尔多瓦/摄像头/ 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"; 
+0

感谢您分享修复!根据另一个回复,你也可以升级到最新的插件版本来解决问题。 – Andy

+0

关于升级到最新版本的插件,我不知道我是否理解正确。我正在使用cordova 4.0并通过命令行安装插件,因此这将是该插件的最新版本,对不对? 谢谢! –