2010-12-17 11 views
9

Tümüyle java'da bir App Engine programı ile POST üzerinden veri paylaşan bir android programı geliştiriyorum. MultipartEntity kullanarak POST uyguladığımda, appengine programı benim anlayamadığım bir nedenden dolayı POST değişkenlerimin herhangi birini göremiyor!Android Multipart POST to Google App Engine çalışmıyor

AppEngine'de Kodu:

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); 
} 

Çalışma Android Parçacığı:

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); 
} 

Başarısız Android Parçacığı:

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); 
    } 

cevap

3

İstemcideki MultipartEntity sınıfını kullanarak, doPost numaranızı farklı bir sunucu tarafında tutmanız ve dosya/parametrelerin Apache Commons FileUpload gibi bir API ile okunması gerekir.

Google App Engine, dosya sistemine yazılmasına izin vermez, bu nedenle Akış API'sini kullanmanız gerekir. Bulduğum

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: Cevabınız için teşekkür ederiz. FileUpload’un düzgün çalışmasını sağlayamadım, bu yüzden kodunuzu kullanamadım. Ancak, örnek AppEngine kodum, basit html formlarını kullanarak sadece ikili yüklemeler aldı. Hala Android ve AppEngine'ın iletişim kurduğuna dair bir şey olduğunu düşünüyorum ve henüz bir iş bulamadım ... – Robert

+0

@Robert Snippet'imi denediniz mi? – systempuntoout

+0

Hayır, FileUpload'u çalışmaya başlayamadım. Ayrıca derleyicinin, uygulama yüklendiğinde FileUpload'un sunucuda bulunmayacağını bildirmesi beni endişelendiriyor ... – Robert

1

En iyi yanıt google'ın kendi örneklerinden biridir: http://code.google.com/intl/fr/appengine/kb/java.html#fileforms bu sadece systempuntoout en örnekteki gibi FileUpload kullanır.

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); 
    } 
    } 
}