2012-06-06 70 views
0

我無法上傳手機拍攝的圖像在手機間隙android版本中。 對於iOS,它的工作正常,但相同的代碼不適用於Android版本使用手機差距PhoneGap中FileTransfer的上傳問題

我得到200響應代碼,但沒有從服務器的「成功」響應。

我使用的是cordova-1.7.0.js,目標SDK是Android 2.1。

下面是示例代碼:

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

你在「adb logcat」中看到了什麼?服務器端日誌呢? –

+0

我直接在設備上運行,所以我無法看到關於服務器端的任何日誌 我有我的設備發送的Echo值,以便我可以看到值,但沒有任何服務器,我得到200只有響應碼。 –

+0

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

回答

0

現在好了,我們是在科爾多瓦-1.9.0還增加Apache庫:公地IO-2.4.JARS

我一直在試圖上傳圖片從PhoneGap的Android模擬器到Servlet來存儲圖像

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

也不要忘記攝像機的權限添加到Android模擬器

HTML代碼:

<!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

首先確保你的doPost方法獲取調用 如果它不叫寫doGet()方法並在該呼叫中以下列方式發帖

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

然後,你需要放置在lib文件夾下面的jar文件在WEB-INF

  1. 公地文件上傳-1.2.2.jar
  2. 公地文件上傳-1.2-javadoc.jar
  3. 公地文件上傳-1.2-sources.jar
  4. 公地IO-1.3.2.jar

也把他們構建路徑。

0

我有同樣的問題。我用它添加了代碼

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

在主java文件中的onCreate()方法開始。 這個bug是apache cordova的unresolved bug

0

見我的答案在這裏,這對我的作品在Android完整的代碼(發送圖像和數據給Django的REST API):

android phonegap camera and image uploading

我想關鍵是在:

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

,也許這一個:

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

使用URL連接編碼的URL傳遞給FileTransfer

相關問題