2012-06-06 3 views
0

Je ne parviens pas à télécharger l'image capturée par téléphone dans la version android de téléphone. pour iOS, cela fonctionne très bien, mais le même code ne fonctionne pas pour la version Android en utilisant l'espace téléphoniqueTéléchargement d'un problème avec FileTransfer dans PhoneGap

Je reçois 200 code de réponse, mais aucune réponse de «succès» du serveur. J'utilise cordova-1.7.0.js et le SDK cible est Android 2.1.

Voici l'exemple de code:

function imageUpload(imageURI) 
{ 
    var options = new FileUploadOptions(); 
    options.fileKey="image"; 
    options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1); 
    options.mimeType="image/jpeg"; 
    var params = new Object(); 
    var msg="test message"; 
    var token= "test token"; 
    params.message = msg; 
    params.access_token = token; 
    options.params = params; 
    var ft = new FileTransfer(); 
    ft.upload(imageURI, "http://mydomain.info/demo/upload.php", win, fail, options,false); 
} 
+0

Qu'est-ce que vous avez vu dans "adb logcat"? Qu'en est-il des journaux côté serveur? –

+0

Je suis directement en cours d'exécution à l'appareil, donc je ne peux pas voir côté serveur J'ai Echo la valeur que j'envoie de mon appareil, de sorte que je peux voir la valeur, mais rien ne va au serveur et je reçois 200 code de réponse seulement. –

+0

https://developer.android.com/guide/developing/tools/adb.html#logcat –

Répondre

0

Eh bien maintenant, nous sommes sur Cordova-1.9.0 également ajouter des bibliothèques apache: commons-io-2.4.JARS

Je suis en train de télécharger l'image de PhoneGap émulateur Android Servlet pour stocker des images

code Servlet: uploadpic.java

private static final String BASE_DIRECTORY = "/Users/tshah/Pictures"; 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

// boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

    System.out.println("Do post...."); 

    /** 
    * The base upload directory. In this directory all uploaded files will 
    * be stored. With the applet param tag 'directory' you can create a 
    * subdirectory for a user. 
    * See http://www.javaatwork.com/parameters.html#directory for more 
    * information about the 'directory' param tag. For a Windows environment 
    * the BASE_DIRECTORY can be e.g. * 'c:/temp' for Linux environment '/tmp'. 
    */ 


    boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

    // check if the http request is a multipart request 
    // with other words check that the http request can have uploaded files 
    if (isMultipart) { 

     // Create a factory for disk-based file items 
     FileItemFactory factory = new DiskFileItemFactory(); 

     // Create a new file upload handler 
     ServletFileUpload servletFileUpload = new ServletFileUpload(factory); 

     // Set upload parameters 
     // See Apache Commons FileUpload for more information 
     // http://jakarta.apache.org/commons/fileupload/using.html 
     servletFileUpload.setSizeMax(-1); 

     try { 

     String directory = ""; 

     // Parse the request 
     List items = servletFileUpload.parseRequest(request); 

     // Process the uploaded items 
     Iterator iter = items.iterator(); 

     while (iter.hasNext()) { 
      FileItem item = (FileItem) iter.next(); 

      // the param tag directory is sent as a request parameter to 
      // the server 
      // check if the upload directory is available 
      if (item.isFormField()) { 

      String name = item.getFieldName(); 

      if (name.equalsIgnoreCase("directory")) { 

       directory = item.getString(); 
      } 

      // retrieve the files 
      } else { 

      // the fileNames are urlencoded 
      String fileName = URLDecoder.decode(item.getName()); 

      File file = new File(directory, fileName+".jpeg"); 
      file = new File(BASE_DIRECTORY, file.getPath()); 

      // retrieve the parent file for creating the directories 
      File parentFile = file.getParentFile(); 

      if (parentFile != null) { 
       parentFile.mkdirs(); 
      } 

      // writes the file to the filesystem 
      item.write(file); 
      } 
     } 

     } catch (Exception e) { 
     e.printStackTrace(); 
     response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
     } 

     response.setStatus(HttpServletResponse.SC_OK); 

    } else { 
     response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
    } 
} 
1

Ne plus oublier d'ajouter la permission de l'appareil photo à l'émulateur Android

HTML CODE:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Login Page</title> 
       <meta name="viewport" content="width=device-width, initial-scale=1"> 

    <script type="text/javascript" charset="utf-8" src="cordova-1.9.0.js"></script> 
    <link rel="stylesheet" 
href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" /> 
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> 
    <script 
src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script> 

    <script type="text/javascript"> 


     function PictureSourceType() {}; 
     PictureSourceType.PHOTO_LIBRARY = 0; 
     PictureSourceType.CAMERA = 1; 

     function getPicture(sourceType) 
     { 
      var options = { quality: 10 }; 
      if (sourceType != undefined) { 
        options["sourceType"] = sourceType; 
       // options["destinationType"] = destinationType.DATA_URL; 
      } 
      // if no sourceType specified, the default is CAMERA 
      navigator.camera.getPicture(getPicture_Success, null, options); 
     }; 


     function getPicture_Success(imageData) 
     { 
       alert("getpic success "+ imageData); 
       document.getElementById("test_img").src = imageData; 
     }; 

     function success(response) { 
      alert("Your photo has been uploaded!"); 
      }; 
      // callback if the photo fails to upload successfully. 

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

     function uploadPhoto() 
     { 
      var imageFile = document.getElementById("test_img").src; 
      alert(imageFile); 




      var ft,options; 


      options = new FileUploadOptions(); 
      options.fileKey = "profile_image"; 
       // name of the file: 
       options.fileName = imageFile.substr(imageFile.lastIndexOf('/') + 1); 
       // mime type: 
       options.mimeType = "multipart/form-data"; 
       params = { 
       val1: "some value", 
       val2: "some other value" 
       }; 
       options.params = params; 



      ft = new FileTransfer(); 
      ft.upload(imageFile, 'http://10.0.2.2:8080/cio/uploadpic', success, fail, options); 
      alert("There is something called file transfer " + imageFile); 

     }; 

     </script> 
     </head> 

     <body> 
    <div data-role="page" id="cameraPage"> 
    <div data-role="header" data-position="inline"> 
     <h1>Edit profile Pic</h1> 
     <a href="index.html" data-icon="delete" class="ui-btn-right">Cancel</a> 
    </div> 

    <div data-role="content"> 
     <center> 
     <img style="width: 60px; height: 60px" id="test_img" src="" /> 
     </center> 

     <button onclick="getPicture()">From Camera</button> 

     <button onclick="getPicture(PictureSourceType.PHOTO_LIBRARY)">From 
      Photo Library</button> 
     <button onclick="uploadPhoto()">Upload Photo</button> 


    </div> 

</div> 

1

d'abord, assurez-vous que votre méthode doPost est obtenir appelé Si on ne l'appelle écriture DoGet() méthode et à l'intérieur de cet appel publient de la façon suivante

protected void doGet(HttpServletRequest request, HttpServletResponse response) { 
    doPost(request,response); 
} 

alors, vous devez placer les fichiers JAR suivants dans le dossier lib sous WEB-INF

  1. commons-fileupload-1.2.2.jar
  2. commons-fileupload-1,2-javadoc.jar
  3. commons-fileupload-1,2-sources.jar
  4. commons-io-1.3.2.jar

les mettre également en voie de construction.

0

J'ai eu le même problème. Je l'ai corrigé en ajoutant le code

System.setProperty("http.keepAlive", "false"); 

dans le fichier java principal au début de la méthode onCreate(). Ce bug est unresolved bug de Apache Cordova.

0

Voir ma réponse ici, cela fonctionne pour moi sur android (envoi de l'image et les données à un django reste api) pour le code complet:

android phonegap camera and image uploading

Je suppose que l'astuce est:

options.chunkedMode = true; //this is important to send both data and files 

et peut-être celui-ci:

var url=encodeURI("http://your_url_for_the_post/"); 

utiliser une URL en URL codée pour passer au FileTransfer

Questions connexes