首页 文章

Cordova Image Upload重复问题

提问于
浏览
1

从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 回答

  • 1

    显然这是Cordova的Camera插件的一个错误 . 如果你用一些修改参数调用getPicture,比如更改宽度或高度,插件会自动创建一个新的图像文件,但是......创建的文件通常被称为“modified.jpg” .

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

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

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

  • 1

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

    升级插件至少解决了我的案例中的错误 .

  • 3

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

    这个插件很好地解决了缓存的路径问题,最重要的是,用户可以选择1到多个图像,并在用户选择图像时为用户提供更好的体验 .

  • 2

    我一直有同样的问题,并密切关注这个问题,这使我想到了一个可能的解决方案 .

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

    作为一种解决方法,我会在选择图像后立即上传图像,因此本地名称是否相同并不重要 . 我通过php创建文件名功能 .

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

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

相关问题