2012-12-17 17 views
6

Próbuję przesłać plik na mój serwer za pomocą Phonegapa. Obecnie jestem zatrzymany, gdy błąd, który mówi:Załaduj obraz za pomocą Phonegap: InvalidCastException

InvalidCastException 
Failed to deserialize WP7CordovaClassLib.Cordova.Commands.FileTransfer+UploadOptions[] with JSON value :: ["{\"filePath\":\"/CapturedImagesCache/PhotoChooser-51766419-c657-46db-a53d-f09bee300a89.jpg\",\"server\":\"http://server.myapp.srv.co.nz/pages/fileupload\",\"fileKey\":\"file\",\"fileName\":\"PhotoChooser-51766419-c657-46db-a53d-f09bee300a89.jpg\",\"mimeType\":\"image/jpg\",\"params\":\"value1=test&value2=param\",\"chunkedMode\":false}"] 

HTML + JavaScript

<!DOCTYPE html> 
<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <meta name="format-detection" content="telephone=no" /> 
    <title>File Transfer Example</title> 

</head> 
<body> 
    <button id="uploadPhotoButton">Upload a Photo</button> 

    <script type="text/javascript" src="cordova-2.2.0.js"></script> 
    <script type="text/javascript" src="js/jquery-1.8.2.min.js"></script> 
    <script type="text/javascript" src="js/jquery.mobile-1.2.0.min.js"></script> 
    <script type="text/javascript" src="js/camera.js"></script> 
    <script type="text/javascript"> 

    $(document).one("pause", function() { 
     console.log('Paused.'); 
    }); 

    $(document).one("resume", function() { 
     console.log('Resumed.'); 
    }); 

    $(document).one("deviceready", function() { 
     console.log('Device is ready.'); 
    }); 

    $(document).one("backbutton", function() { 
     console.log('Back button pressed.'); 
    }); 

    $(document).ready(function() { 
     console.log('DOM is ready.'); 

     $(document).on("click", "#uploadPhotoButton", function (e) { 
      console.log('clicked button'); 
      getImage(); 
     }); 


     function getImage() { 
      // Retrieve image file location from specified source 
       navigator.camera.getPicture(uploadPhoto, function (message) { 
        alert('get picture failed'); 
       }, { 
        quality: 50, 
        destinationType: navigator.camera.DestinationType.FILE_URI, 
        sourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY 
       } 
      ); 

     } 

     function uploadPhoto(imageURI) { 
      var options = new FileUploadOptions(); 
      options.fileKey = "file"; 
      options.fileName = imageURI.substr(imageURI.lastIndexOf('/') + 1); 
      options.mimeType = "image/jpeg"; 

      var params = new Object(); 
      params.value1 = "test"; 
      params.value2 = "param"; 

      options.params = params; 
      options.chunkedMode = false; 

      var ft = new FileTransfer(); 
      ft.upload(imageURI, "http://my.server.co.nz/pages/fileupload", win, fail, options); 
     } 

     function win(r) { 
      console.log("Code = " + r.responseCode); 
      console.log("Response = " + r.response); 
      console.log("Sent = " + r.bytesSent); 
      alert(r.response); 
     } 

     function fail(error) { 
      alert("An error has occurred: Code = " = error.code); 
     } 
    }); 

    </script> 
    </body> 
</html> 

Kompletny dziennik błędów.

GapBrowser_Navigated :: /app/www/index.html#/app/www/uploadtest.html 
Log:"clicked button" 
The thread '<No Name>' (0xf55026a) has exited with code 0 (0x0). 
The thread '<No Name>' (0xe3f0326) has exited with code 0 (0x0). 
INFO: AppDeactivated 
INFO: AppActivated 
Log:"Paused." 
The thread '<No Name>' (0xf1a02e6) has exited with code 0 (0x0). 
Log:"Resumed." 
The thread '<No Name>' (0xf2a01d2) has exited with code 0 (0x0). 
options = ["{\"filePath\":\"/CapturedImagesCache/PhotoChooser-51766419-c657-46db-a53d-f09bee300a89.jpg\",\"server\":\"http://my.server.co.nz/pages/fileupload\",\"fileKey\":\"file\",\"fileName\":\"PhotoChooser-51766419-c657-46db-a53d-f09bee300a89.jpg\",\"mimeType\":\"image/jpg\",\"params\":\"value1=test&value2=param\",\"chunkedMode\":false}"] 
A first chance exception of type 'System.InvalidCastException' occurred in System.ServiceModel.Web.dll 
A first chance exception of type 'System.InvalidCastException' occurred in System.ServiceModel.Web.dll 
InvalidCastException 
Failed to deserialize WP7CordovaClassLib.Cordova.Commands.FileTransfer+UploadOptions[] with JSON value :: ["{\"filePath\":\"/CapturedImagesCache/PhotoChooser-51766419-c657-46db-a53d-f09bee300a89.jpg\",\"server\":\"http://server.myapp.srv.co.nz/pages/fileupload\",\"fileKey\":\"file\",\"fileName\":\"PhotoChooser-51766419-c657-46db-a53d-f09bee300a89.jpg\",\"mimeType\":\"image/jpg\",\"params\":\"value1=test&value2=param\",\"chunkedMode\":false}"] 
A first chance exception of type 'System.NullReferenceException' occurred in Lion.MyApp.dll 
The thread '<No Name>' (0xfdc025e) has exited with code 0 (0x0). 
Log:"Error in error callback: FileTransfer1325332352 = ReferenceError: Invalid left-hand side in assignment" 
The thread '<No Name>' (0xfa60286) has exited with code 0 (0x0). 

Czy ktoś ma pomysł, jak to zrobić?

Dzięki!

W

+0

Po tej aktualizacji nie mogę tego naprawić w emulatorze Windows Phone. Przetestowałem to na iPhone i zadziałało. – wenbert

Odpowiedz

1

Myślę, że zniekształcasz swoją wartość opcji. Czy musisz przekazać JSON lub rzeczywisty obiekt?

Właśnie przechodzisz tablicę z tekstem.

options = ["{\"filePath\":\"/CapturedImagesCache/PhotoChooser-51766419-c657-46db-a53d-f09bee300a89.jpg\",\"server\":\"http://my.server.co.nz/pages/fileupload\",\"fileKey\":\"file\",\"fileName\":\"PhotoChooser-51766419-c657-46db-a53d-f09bee300a89.jpg\",\"mimeType\":\"image/jpg\",\"params\":\"value1=test&value2=param\",\"chunkedMode\":false}"] 

Błąd wydaje się obejmować problemy z deserializacją.

0

Miałem problem podobny do twojego. Rozwiązałem to, zmieniając parametr mimeType na "text/plain".

Czy używasz params do wysyłania? Jeśli jest to fałsz, myślę, że potrzebujesz wysłać puste parametry.

+0

Próbowałem użyć 'text/plain' dla mimeType i nie zadziałało. – wenbert

0

miałem ten problem przed, spróbuj przygotować obraz w html pierwszy, i nie brać go bezpośrednio z nawigatora, to nie może zapisywanie zrobionego zdjęcia w niej środków pieniężnych;)

W moim rozwiązanie Przypuszczam mieć Tage obrazu id = 'camera_image'

img id = 'camera_image' ...

potem ustawić wszystkie zmienne obrazu w nim i przesłać go (jak ty zobaczę w poniższym kodzie).

oto funkcje 2 użyłem:

function takephoto(){  

     navigator.camera.getPicture(  
     function(uri){ 
      $('#camera_image').show(); 
      var img = document.getElementById('camera_image'); 
      img.style.visibility = "visible"; 
      img.style.display = "block"; 
      img.src = uri; 
      uploadPhoto(img);      
      alert("Success"); 
     }, 
     function(e) { 
      console.log("Error getting picture: " + e); 
     }, 
     { 
      quality: 50, 
      destinationType: navigator.camera.DestinationType.FILE_URI 
     }); 

     // Get URI of picture to upload 
     var img = document.getElementById('camera_image'); 
     var imageURI = img.src; 
     if (!imageURI || (img.style.display == "none")) { 
       alert("Take picture or select picture from library first."); 
       return; 
     } 
} 

wyboru istniejącego pliku:

function choosephoto(){ 
    navigator.camera.getPicture(
     function(uri) { 
      $('#camera_image').show(); 
      var img = document.getElementById('camera_image'); 
      img.style.visibility = "visible"; 
      img.style.display = "block"; 
      img.src = uri; 
      uploadPhoto(img); 
     }, 
     function(e) { 
      console.log("Error getting picture: " + e); 
     }, 
     { 
      quality: 50, 
      destinationType: navigator.camera.DestinationType.FILE_URI, 
      sourceType: navigator.camera.PictureSourceType.SAVEDPHOTOALBUM 
     });    

     // Get URI of picture to upload 
     var img = document.getElementById('camera_image'); 
     var imageURI = img.src; 
     if (!imageURI || (img.style.display == "none")) { 
      alert("please select a pic first"); 
      return; 
     } 

    } 

w funkcji wysyłania: funkcja uploadPhoto (img) { imageURI = img.src. ..

ps: przepraszam za sformatowanie mojego kodu, to nie naprawia.

+0

@wenbert dzięki za naprawienie formatu :) –

1

Umieść swój getImage, uploadImage, wygraj, zawieś na zewnątrz funkcji $ (document) .ready inline function call.

Odniesienie do wygranej i porażki to w rzeczywistości zamknięcie, a luka telefoniczna uzyskuje ją jako zerową, gdy próbuje uzyskać bezpośredni dostęp do tych metod. Phonegap prawdopodobnie oczekuje globalnej funkcji zamiast ukrytej funkcji wewnątrz funkcji.

PhoneGap wykonuje swój kod poza kontekstem javascript, co może działać w prawdziwym kodzie JavaScript może nie działać poprawnie z phonegap.

+0

Nie. Umieszczenie metody getImage i innych metod poza funkcją '$ (document) .ready' jQuery nie działa. Mam ten sam błąd. – wenbert