¿Cómo puedo enviar un campo de texto en la solicitud POST que carga un blob en Blobstore y lo recupero en el controlador de carga del blob?

He leído varias preguntas similares sobre StackOverflow, pero aún no he encontrado una solución a este problema.

Estoy subiendo una gota de Android a Blobstore de App Engine a través de un HTTPPost a la URL de subida generada por el servicio Blobstore. Quiero ser capaz de enviar algunos metadatos textuales con esta solicitud que identifica este blob. Quiero recuperar esta información junto con la clave blob en el servlet del manejador de subida que se llama después de cargar el blob.

El problema es que el blob se carga mediante la codificación multiparte y App Engine no admite el estándar Servlet v3.0, por lo que no puedo usar req.getPart () para obtener la parte textual. (El propio blob es devuelto por el servicio Blobstore, por lo que parte de la solicitud ya está analizada para nosotros.)

¿Cómo puedo evitar este problema pasando sólo un parámetro de texto junto con el archivo que se carga en el Blobstore y recuperarlo en el servlet que se llama después de la carga de la gota?

¡Muchas gracias por su ayuda! Muy atrapado en este!

Aquí está el código que utilizo para HttpPost en Android:

File file = new File(filePath); MultipartEntityBuilder entityBuilder = MultipartEntityBuilder .create(); entityBuilder.addBinaryBody("file", file); DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(blobUploadURL); httpPost.setEntity(entityBuilder.build()); try { HttpResponse response = httpClient.execute(httpPost); statusCode = response.getStatusLine().getStatusCode(); } 

ACTUALIZACIÓN (8 de diciembre, 14):

He añadido un cuerpo de texto al constructor de entidad antes de construir la entidad multipart para la solicitud HttpPost de la siguiente manera:

  String param="value"; entityBuilder.addTextBody("param", param); 

Para el servlet que maneja la devolución de llamada de Blobstore después de que se haya cargado el blob, utilicé el método descrito por Google para analizar una solicitud de HttpPost en App Engine en este tutorial como se muestra a continuación:

 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String paramNames="default"; try { ServletFileUpload upload=new ServletFileUpload(); FileItemIterator iterator=upload.getItemIterator(req); while(iterator.hasNext()){ FileItemStream item=iterator.next(); InputStream stream=item.openStream(); if(item.isFormField()){ paramNames+=item.getFieldName() + ", "; } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); paramNames="error"; } //save the paramNames variable in the Datastore for debugging later saveParamNamesInDatastore(paramNames); } 

Sin embargo, cuando compruebo la variable paramNames en el almacén de datos después de esta operación, su valor sigue siendo "predeterminado". Esto significa que no se encontró ningún campo de formulario en la petición POST reescrita que Blobstore pasó al servlet del manejador de subida. ¿¿A dónde ir desde aquí??

3 Solutions collect form web for “¿Cómo puedo enviar un campo de texto en la solicitud POST que carga un blob en Blobstore y lo recupero en el controlador de carga del blob?”

Hay una manera de publicar los metadatos con tu blob con la información que no sería representada por un blobkey:

  1. En su formulario de carga, incluya lo siguiente:

     method="post" enctype="multipart/form-data" 
  2. Ahora puede agregar campos ocultos:

     <input type="hidden" name="myName" value="<%= myName %>"/> 
  3. O puede agregar campos de entrada:

     <input type="text" name="myText" size="50" value="Enter your text"/> 
  4. En su servlet, asegúrese de que el controlador de correo lea los metadatos

     String userName = req.getParameter("myName"); 
  5. Ahora tiene el formulario de carga con toda la información.

  6. Cuando usted está pasando la información para servir el blob, puede usar

     &blobkey=daffedafdfe&myName=Blah 

Por lo tanto, no almacena exactamente la información en el propio blob, pero puede incluirlo en el formulario de subida.

Por lo que puedo decir, el MultiPartEntityBuilder es respsonsible para burlarse de un HTML "forma" de enctype = "multipart / form-data", y luego por el momento de llegar a las líneas DefaultHttpClient, que acaba de enviar la solicitud de este formulario por correo postal. Debe buscar en el documento el constructor de la entidad. Tiene una función para agregar campos de texto a la "forma" [1].

[1] – http://hc.apache.org/httpcomponents-client-ga/httpmime/apidocs/org/apache/http/entity/mime/MultipartEntityBuilder.html#addTextBody(java.lang.String,%20java.lang .Cuerda)

Por si acaso, es posible que desee especificar

entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

Después de crear el objeto.

Si eso no funciona, puede ser aconsejable publicar contra requestbin para ver exactamente lo que está recibiendo

  • Cómo cambiar de HttpClient a HttpUrlConnection
  • Enviando mensaje a la aplicación del servidor con GCM
  • Enviar arraylist de servlet a la aplicación de Android
  • Cómo pasar los datos del servlet a la aplicación android
  • Comprueba si la aplicación está disponible en Android Market
  • Cómo comprimir un JSONObject enviarlo sobre Http en Android?
  • Android: conexión HTTPS (SSL) mediante HttpsURLConnection
  • (httplog) -static: issbsettingenabled false android
  • Java.lang.ClassCastException: [Ljava.lang.Object; No se puede emitir a com.sakhnin.classes.MonthlySummary
  • ajax xhr.getResponseHeader ("encabezado de usuario") no funciona para el navegador nativo de Android
  • Cómo enviar un archivo de audio de un cliente android a un servidor servlet
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.