2014-07-09 170 views
3

我在使用Cordova的camera.getPicture插件和它們的FileTransfer.upload插件時遇到了一些問題。最奇怪的是,當我從相機拍攝照片時,一切運作良好,而不是從圖書館檢索時。phonegap/cordova getPicture from photolibrary file-transfer not working

的問題是這樣的一個:Phonegap/Cordova Uploading Image from gallery is not working on Android Kitkat

但是我用科爾多瓦3,這樣就必須解決奇巧的問題。

我的代碼:

var imageUploadUrl = setting_api_url + "Umbraco/Api/ImageApi/PostUpload"; 
var formSubmitUrl = setting_api_url + "Umbraco/Api/FormApi/PostSend"; 
var imageUriStorage = []; 
var resultsCollection = []; 
var FieldId; 

var take_photo = function(fieldId) { 
FieldId = fieldId; 
navigator.camera.getPicture(onTakeSuccess, 
          onTakeFail, 
          { 
    quality: 30, 
    destinationType: Camera.DestinationType.FILE_URI, 
    sourceType: Camera.PictureSourceType.CAMERA, 
    targetWidth: 800, 
    targetHeight: 800, 
    correctOrientation: true 
}); 
}; 

var get_photo = function(fieldId) { 
FieldId = fieldId; 
navigator.camera.getPicture(onTakeSuccess, onTakeFail, { 
    quality: 30, 
    destinationType: Camera.DestinationType.FILE_URI, 
    sourceType: Camera.PictureSourceType.PHOTOLIBRARY, 
    targetWidth: 800, 
    targetHeight: 800, 
    correctOrientation: true }); 
}; 

var onTakeSuccess = function(imageURI) { 
console.log("onTakeSuccess imageURI= " + imageURI); 

var image = document.getElementById("preview-" + FieldId); 

// UPLOAD PART COPIED 
var options = new FileUploadOptions(); 
options.fileKey = "file"; 
options.fileName = src.substr(src.lastIndexOf('/') + 1); 
var filetype = src.substr(src.lastIndexOf('.') + 1); 
if(filetype == "png") { 
    options.mimeType = "image/png"; 
} 
else if (filetype == "jpg") { 
    options.mimeType = "image/jpeg"; 
} 

var ft = new FileTransfer(); 
ft.upload(imageURI, encodeURI(imageUploadUrl), image_upload_win, image_upload_fail, options); 
// END. 


imageUriStorage.push({ 'Id':FieldId, 'Path': imageURI}); 

image.src = imageURI; 
}; 

var onTakeFail = function(message) { 
alert('on take fail. Code: ' + message); 
}; 

// called when upload succeeds   
var image_upload_win = function (r) { 
    console.log("Code = " + r.responseCode); 
    console.log("Response = " + r.response); 
    console.log("Sent = " + r.bytesSent); 
}; 

// when upload fails 
var image_upload_fail = function (error) { 
    alert("Code = " + error.code + "-" + error.http_status + ", image:" + error.source); 
    console.log("upload error source " + error.source); 
    console.log("upload error target " + error.target); 
}; 

兩個take_photo和get_photo打同樣的功能onTakeSuccess,所以他們會得到同樣的過程。當源是相機時,圖像將正確上傳,並且服務器提供正確的響應(和HTTP 201)。

但是,當源是庫時,將失敗。 FileTransfer.Upload給出錯誤代碼1(文件未找到),但這不可能是真實的,因爲圖像在我的應用程序的圖像元素中正確顯示。

服務器提供HTTP 400錯誤請求。

這個過程有一個不同之處,就是圖片網址的格式,但是應該如何改變呢?

登錄成功Getpicture中(CAMERA):

onTakeSuccess imageURI=file:///mnt/sdcard/Android/data/com.XXX.YYY/cache/1404910577158.jpg 
Code = 201 
Response = "8999" 
Sent = 195 

登錄不成功Getpicture中(庫):

onTakeSuccess imageURI= file:///mnt/sdcard/Android/data/com.XXX.YYY/cache/modified.jpg?1404910903858 
upload error source file:///mnt/sdcard/Android/data/com.XXX.YYY/cache/modified.jpg?1404910903858 
upload error target https://CORRECTURL/Umbraco/Api/ImageApi/PostUpload 

此外,Getpicture中(庫)的情況給出了這樣的警告:

Code = 1-400, image:file:///mnt/sdcard/Android/data/com.XXX.YYY/cache/modified.jpg?1404910903858

+0

您有這方面的任何解決方案?我有同樣的問題,從我的圖片庫的路徑是不同於imageURI – fsi

+0

還沒有找到它。 –

+0

也許這個答案可能是有用的http://stackoverflow.com/questions/26154810/how-to-get-image-object-using-cordova – fsi

回答

1

我的cu rrent解決方法是刪除「?」以及imageUri中的所有內容。這樣的URI總是看起來像:

file:///mnt/sdcard/Android/data/com.XXX.YYY/cache/modified.jpg 

在我的情況下,這個工作是否正常,正確的文件傳輸

+0

如果我刪除後?並通過modified.jpg,那麼它也不起作用。 – sasi

0

是的!圖庫中的一些文件的格式如下: modified.jpg?1438896451328以文件的名義。

爲了防止,我把一些代碼在我的upload.php的文件:

 $temporary = explode(".", $_FILES["file"]["name"]); 
     $file_extension = end($temporary); 

    // cortamos caracteres extraños por si llega algun nombre de archivo raro 
     $cadena = $file_extension; 
     $patron = "?"; 
    // localicamos en que posición se haya "?" 
     $posicion = strpos ($cadena, $patron); 
    // eliminamos los caracteres desde ? hacia la derecha 
     if ($posicion !== false){ 
     $file_extension = substr ($cadena, 0, $posicion); 
     } 

,那麼你可以過濾文件類型,大小等操作,最後保存。

0

使用6.0.0科爾多瓦,科爾多瓦 - 插件相機2.1.0,科爾多瓦 - 插件白名單1.2.1

我有類似的問題(雖然可能針對不同的原因,因爲它是一個較新的版本)。

我發現我需要在配置中有以下幾行。XML

<access origin="*" /> 
<access origin="content:///*" /> 

注意:只有

<access origin="*" /> 

不夠