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

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

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

El problema es que el blob se carga mediante encoding multiparte y App Engine no es compatible con el estándar Servlet v3.0, por lo que no puedo usar req.getPart () para obtener la parte textual. (El servicio Blobstore devuelve el blob en sí mismo, por lo que ya hemos analizado parte de la solicitud).

¿Cómo puedo solucionar este problema pasando solo un parámetro de texto junto con el archivo que se carga en Blobstore y lo recupero en el servlet al que se llama después de cargar el blob?

¡Muchas gracias por su ayuda! Bastante atascado en este!

Aquí está el código que uso 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 de ’14):

Agregué un cuerpo de texto al generador de entidades antes de comstackr la entidad multiparte para la solicitud HttpPost de la siguiente manera:

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

Para el servlet que maneja la callback de Blobstore después de que se haya cargado el blob, usé el método descrito por Google para analizar una solicitud HttpPost en App Engine en este tutorial como se describe 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 verifico la variable paramNames en el almacén de datos después de esta operación, su valor sigue siendo “predeterminado”. Eso significa que no se encontró ningún campo de formulario en la solicitud POST reescrita que Blobstore pasó al servlet del controlador de carga. ¿¿A dónde ir desde aquí??

Hay una forma de publicar metadatos con su blob con la información que no estaría representada por un blobkey:

  1. En su formulario de carga, incluya esto:

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

      
  3. O puede agregar campos de entrada:

      
  4. En tu servlet, asegúrate de que el manejador de correos lee los metadatos

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

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

     &blobkey=daffedafdfe&myName=Blah 

Por lo tanto, no está almacenando exactamente la información en el blob en sí, pero puede incluirla en el formulario de carga.

Por lo que puedo decir, MultiPartEntityBuilder es responsable de burlarse de una “forma” HTML de enctype = “multipart / form-data”, y luego, cuando llega a las líneas DefaultHttpClient, solo está enviando la solicitud desde este formulario. por correo postal. Debe buscar en la documentación del generador de entidades. Tiene una función para agregar campos de texto al “formulario” [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, es recomendable que publiques en el campo de solicitud para ver exactamente lo que estás recibiendo.