2015-05-25 53 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並通過命令行安裝插件,因此這將是該插件的最新版本,對不對? 謝謝! –