Cordova 图片上传重复问题

Cordova Image Upload Duplicate Issue

我在将文件从我的 Cordova 应用程序上传到服务器时遇到了一个非常奇怪的现象。

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

现在,奇怪的问题是,在 5-10% 的情况下,我们的 Android 应用用户上传的两张照片最终都是第二张照片。这意味着,在用户 select 编辑照片 1 和 2 并上传后,服务器端收到的图像都是照片 2。

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

我们尝试了很多次,但无法在我们的 Android 设备(包括较慢、较旧的设备)上重现此问题。

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

问题只会以一种方式发生 - 因为两张照片都变成了照片 2,但从来没有都变成照片 1。

请指教,谢谢!

[更新]

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

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

这是插件错误吗,总是使用与缓存图像相同的文件名,是否与某些 phone 内存问题有关?有没有办法让它使用随机文件名,而不是仅仅将随机参数附加到同一个文件?

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

显然这是 Cordova 的相机插件的错误。如果你用一些修改参数调用 getPicture,比如改变宽度或高度,插件会自动创建一个新的图像文件,但是......创建的文件被普遍称为 "modified.jpg".

因此,在同一个实例中,如果我使用图像修改参数对 getPicture 进行了两次或多次调用,所有后续图像都将以相同名称存储在 Cordova 的缓存文件夹中,从而覆盖之前的图像。

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

希望Cordova在后续版本中修复Camera插件问题。

我一直遇到同样的问题并密切关注这个问题,这让我找到了一个可能的解决方案。

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

作为解决方法,我会在他们 select 上传图片后立即上传,因此本地名称是否相同并不重要。我通过 php 函数创建文件名。

就可用性而言,这实际上改进了 selecting 多张图片的过程,因为用户只需稍等片刻即可上传一张图片。我在上传时禁用图像 select 按钮以阻止重复发生。

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

这个插件很好用,解决了缓存路径问题,除此之外,用户可以选择 1 到多个图像,并且在 [=17= 上选择图像时也为用户提供了更好的体验].

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

升级插件至少解决了我的问题。

我解决问题如下,帮到你了=)

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