PhoneGap中FileTransfer的上传问题

问题描述:

我无法上传手机拍摄的图像在手机间隙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 –

现在好了,我们是在科尔多瓦-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); 
    } 
} 

也不要忘记摄像机的权限添加到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> 

首先确保你的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

也把他们构建路径。

我有同样的问题。我用它添加了代码

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

在主java文件中的onCreate()方法开始。 这个bug是apache cordova的unresolved bug

见我的答案在这里,这对我的作品在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