2010-12-17 67 views
9

我正在開發一個Android程序,通過POST與App引擎程序共享數據,全部在java中。當我使用MultipartEntity進行POST時,appengine程序由於某些原因無法查看我的POST變量!Android多部門POST到谷歌應用程序引擎不工作

的AppEngine代碼:

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
    resp.setContentType("text/plain"); 
    resp.getWriter().println("Output:"); 

    String mRoutine = req.getParameter("Routine"); 
    resp.getWriter().println("Routine: " + mRoutine); 

    String mPMode = req.getParameter("PMode"); 
    resp.getWriter().println("PMode: " + mPMode); 
} 

工作Android的代碼片段:

HttpPost post = new HttpPost("http://XXX.appspot.com/Echo"); 
HttpClient client = new DefaultHttpClient(); 
post.setEntity(new UrlEncodedFormEntity(data,HTTP.UTF_8)); 
HttpResponse response = client.execute(post); 
HttpEntity resmarkMessagesReadFrom = response.getEntity(); 
if (resmarkMessagesReadFrom != null) { 
    Result_STR= "Response:\n" + EntityUtils.toString(resmarkMessagesReadFrom); 
    mMSGBox.setText(Result_STR); 
} 

失敗的Android段:

HttpPost post = new HttpPost("http://XXX.appspot.com/Echo"); 
HttpClient client = new DefaultHttpClient(); 
MultipartEntity reqmarkMessagesReadFrom = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
try { 
    reqmarkMessagesReadFrom.addPart("Routine", new StringBody("Neutral")); 
    post.setEntity(reqmarkMessagesReadFrom); 
    HttpResponse response = client.execute(post); 
    HttpEntity resmarkMessagesReadFrom = response.getEntity(); 
    if (resmarkMessagesReadFrom != null) { 
     Result_STR= "Response:\n" + EntityUtils.toString(resmarkMessagesReadFrom); 
     mMSGBox.setText(Result_STR); 
    } 

回答

3

在客戶端使用MultipartEntity類,您需要以不同的方式處理服務器端的doPost,使用類似Apache Commons FileUpload的API讀取文件/參數。

Google App Engine不允許寫入文件系統,因此您需要使用Streaming API。

import org.apache.commons.fileupload.FileItemStream; 
import org.apache.commons.fileupload.FileItemIterator; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import java.io.InputStream; 
.. 
public void doPost(HttpServletRequest req, HttpServletResponse res) 
     throws ServletException, IOException { 
    try { 
     ServletFileUpload upload = new ServletFileUpload(); 
     res.setContentType("text/plain"); 

     FileItemIterator iterator = upload.getItemIterator(req); 
     while (iterator.hasNext()) { 
     String name = item.getFieldName(); 
     FileItemStream item = iterator.next(); 
     InputStream stream = item.openStream(); 

     if (item.isFormField()) { 
      resp.getWriter().println((name + " : " + Streams.asString(stream)); 
     } 
     } 
    } catch (Exception ex) { 
     throw new ServletException(ex); 
    } 
} 
+0

systempuntoout:感謝您的回覆。我一直無法讓FileUpload正常工作,所以我一直無法使用你的代碼。但是,我的示例AppEngine代碼使用簡單的html表單就可以獲得二進制上傳。我仍然認爲Android和AppEngine的溝通方式存在問題,我還沒有找到解決方法... – Robert 2011-01-06 17:16:51

+0

@Robert你有沒有試過我的代碼片段? – systempuntoout 2011-01-06 17:29:05

+0

不,我一直無法使FileUpload正常工作。我也擔心編譯器警告我FileUpload在應用程序加載時不會在服務器上可用... – Robert 2011-01-09 00:20:21

1

最佳答案我發現是谷歌自己的一個例子:http://code.google.com/intl/fr/appengine/kb/java.html#fileforms此使用的FileUpload就像systempuntoout的例子。

import org.apache.commons.fileupload.FileItemStream; 
import org.apache.commons.fileupload.FileItemIterator; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import java.io.InputStream; 
import java.io.IOException; 
import java.util.logging.Logger; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class FileUpload extends HttpServlet { 
    private static final Logger log = 
     Logger.getLogger(FileUpload.class.getName()); 

    public void doPost(HttpServletRequest req, HttpServletResponse res) 
     throws ServletException, IOException { 
    try { 
     ServletFileUpload upload = new ServletFileUpload(); 
     res.setContentType("text/plain"); 

     FileItemIterator iterator = upload.getItemIterator(req); 
     while (iterator.hasNext()) { 
     FileItemStream item = iterator.next(); 
     InputStream stream = item.openStream(); 

     if (item.isFormField()) { 
      log.warning("Got a form field: " + item.getFieldName()); 
     } else { 
      log.warning("Got an uploaded file: " + item.getFieldName() + ", name = " + item.getName()); 

      // You now have the filename (item.getName() and the 
      // contents (which you can read from stream). Here we just 
      // print them back out to the servlet output stream, but you 
      // will probably want to do something more interesting (for 
      // example, wrap them in a Blob and commit them to the 
      // datastore). 
      int len; 
      byte[] buffer = new byte[8192]; 
      while ((len = stream.read(buffer, 0, buffer.length)) != -1) { 
      res.getOutputStream().write(buffer, 0, len); 
      } 
     } 
     } 
    } catch (Exception ex) { 
     throw new ServletException(ex); 
    } 
    } 
} 
相關問題