Android Multipart POST para Google App Engine no funciona

Estoy desarrollando un programa android que comparte datos a través de POST con un programa de App Engine, todo en java. Cuando POST usando MultipartEntity el programa appengine no puede ver ninguna de mis variables POST por alguna razón que no puedo entender!

Código de 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); } 

Trabajando Android Snippet:

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

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

Utilizando la clase MultipartEntity en el cliente, debe manejar su doPost de una manera diferente del lado del servidor, leyendo los archivos / parámetros con una API como Apache Commons FileUpload .

Google App Engine no permite escribir en el sistema de archivos, por lo que necesitas usar la API de streaming.

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

La mejor respuesta que he encontrado es uno de los ejemplos propios de Google: http://code.google.com/intl/fr/appengine/kb/java.html#fileforms esto utiliza FileUpload igual que el ejemplo de 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); } } } 
  • Problema con aapt.exe
  • Android: crea un servicio que se ejecuta una vez al día
  • Android - dibujar mapa de bits dentro de la lona
  • Descargar Android SDK de forma programática
  • Archivo de 0 bytes aparece al capturar la pantalla por screencap
  • Android obtiene actividad desde una clase anónima
  • ¿Cómo puedo hacer algo cada segundo?
  • Colorear botones en Android con AppCompat
  • SearchView y título de la actividad en ActionBar
  • No se puede configurar la memoria de invitados 'android_arm': argumento no válido
  • Inyección Dagger 2 en clase Java no Activity
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.