Subir varios archivos de Android a AppEngine en 1 solicitud

Entiendo que puedo subir un archivo a la vez a AppEngine usando solicitudes POST de varias partes / formulario. AppEngine también es compatible con la carga de varios archivos, pero tienes que hacer algunas cosas hokey JSP para que funcione.

Tengo una aplicación que me obliga a cargar algunos datos de formulario, 2 imágenes y 3 campos de texto. ¿Es posible hacerlo a través de AppEngine? He estado tratando de encontrar información sobre esto, pero es difícil nada funciona con la flexibilidad que necesito. Estaré almacenando los datos en la tienda de blob / almacén de datos.

Necesito una solución Java.

Esta es la firma de mi método POST:

import javax.ws.rs.Consumes; import javax.ws.rs.POST; @POST @Consumes(MediaType.MULTIPART_FORM_DATA) public void post( @Context HttpServletRequest request, @Context HttpServletResponse response) throws FileUploadException, IOException {} 

Copie y pegue el Java Servlet si realmente lo necesita. Arriba está la pregunta y los fragmentos de servlets relevantes.

 import java.io.BufferedReader; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.util.Iterator; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import org.apache.commons.fileupload.FileItemHeaders; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.servlet.ServletFileUpload; import com.google.appengine.api.blobstore.BlobstoreService; import com.google.appengine.api.blobstore.BlobstoreServiceFactory; import com.google.appengine.api.files.AppEngineFile; import com.google.appengine.api.files.FileReadChannel; import com.google.appengine.api.files.FileService; import com.google.appengine.api.files.FileServiceFactory; import com.google.appengine.api.files.FileWriteChannel; @Path("/upload") public class FileUploadServlet { private BlobstoreService blobstoreService = BlobstoreServiceFactory .getBlobstoreService(); @POST @Consumes(MediaType.MULTIPART_FORM_DATA) public void post(@Context HttpServletRequest request, @Context HttpServletResponse response) throws FileUploadException, IOException { final ServletFileUpload upload = new ServletFileUpload(); final FileItemIterator fileIter = upload.getItemIterator(request); while (fileIter.hasNext()) { final FileItemStream item = fileIter.next(); String name = item.getName(); String fieldName = item.getFieldName(); String contentType = item.getContentType(); Log.d("Name = " + name); Log.d("Field-Name = " + fieldName); Log.d("Content-Type = " + contentType); FileItemHeaders headers = item.getHeaders(); if(headers != null) { Iterator<String> it = (Iterator<String>)headers.getHeaderNames(); while(it.hasNext()) { String h = it.next(); Log.d(h + " = " + headers.getHeader(h)); } } if (item.isFormField()) { // Nothing } else { RawImageData data = new RawImageData(); data.load(item.openStream()); // RawImageData reads the stream and stores it into a large byte[] called data.imageData ByteBuffer bb = ByteBuffer.wrap(data.imageData); FileService fs = FileServiceFactory.getFileService(); AppEngineFile file = fs.createNewBlobFile(contentType); FileWriteChannel write = fs.openWriteChannel(file, true); write.write(bb); write.closeFinally(); String path = file.getFullPath(); Log.d(path); // Later, read from the file using the file API boolean lock = false; // Let other people read at the same time FileReadChannel readChannel = fs.openReadChannel(file, false); // CRASHES WITH java.nio.charset.IllegalCharsetNameException: image/jpeg // contentType = "image/jpeg" // Again, different standard Java ways of reading from the // channel. BufferedReader reader = new BufferedReader(Channels.newReader(readChannel, contentType)); readChannel.close(); } } response.setContentType("text/html"); response.getOutputStream().write("success".getBytes()); } } 

Excepción completa:

 WARNING: /api/upload java.nio.charset.IllegalCharsetNameException: image/jpeg at java.nio.charset.Charset.checkName(Charset.java:284) at java.nio.charset.Charset.lookup2(Charset.java:458) at java.nio.charset.Charset.lookup(Charset.java:437) at java.nio.charset.Charset.forName(Charset.java:502) at java.nio.channels.Channels.newReader(Channels.java:381) at com.futonredemption.starstarstar.FileUploadServlet.post(FileUploadServlet.java:96) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) blah blah blah 

Puede crear su propio controlador de carga de archivos multipart , luego guardar archivos a través de la API Blobstore FileService .

  • GCM enviar imagen en lugar de mensaje
  • Tener un error mySQL, columna desconocida where clause
  • Cómo comprimir un JSONObject enviarlo sobre Http en Android?
  • Cómo enviar un archivo de audio de un cliente android a un servidor servlet
  • ajax xhr.getResponseHeader ("encabezado de usuario") no funciona para el navegador nativo de Android
  • ¿Cómo puedo pasar varios parámetros en la URL?
  • Transferencia de datos enormes del servlet a la aplicación Android
  • Codificación de caracteres por defecto Jersey / Rest
  • Enviando mensaje a la aplicación del servidor con GCM
  • ¿Qué encabezado se debe utilizar para enviar GZIP comprimido JSON de Android Client a Server?
  • Cómo cambiar de HttpClient a HttpUrlConnection
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.