Construcción multipart / form-data con android
Estoy intentando hacer un HttpPost
con multiPart/form-data
vía mi androide app. Tengo una prueba de cartero que está trabajando con mi api y la vista previa de esa solicitud en el cartero, se parece a esto:
POST /api/0.1/content/upload HTTP/1.1 Host: 54.221.194.167 X-AUTHORIZATION: 166e649911ff424eb14446cf398bd7d6 Cache-Control: no-cache Postman-Token: 2412eba9-f72d-6f3b-b124-6070b5b26644 ----WebKitFormBoundaryE19zNvXGzXaLvS5C Content-Disposition: form-data; name="file01" {"mime_type":"image/jpeg","title":"IMG_20140131_111622"} ----WebKitFormBoundaryE19zNvXGzXaLvS5C Content-Disposition: form-data; name="file01"; filename="addedaslib.jpg" Content-Type: image/jpeg ----WebKitFormBoundaryE19zNvXGzXaLvS5C
Estoy intentando replicar eso usando el multipart / form-data con mi HttpPost del androide pero no parece estar trabajando. ¿Hay una forma de "previsualizar" mi solicitud y ver cómo se está publicando en la API? ¿Qué estoy haciendo mal? mi código:
- El Post HTTP de Multipart de Android no envía el tipo MIME del archivo
- Android con Retrofit2 OkHttp3 - Error POST de varias partes
- Subida de imagen multiparte de Android con HttpConnectionParams obsoleta en nueva API
- Android cliente analizar los datos de formulario de multipart a non ascii
- Android: ¿Cómo subir el archivo .mp3 y la imagen al servidor http?
public HttpResponse invokeXAUTHPOSTService(String url, String token, File file) { client = new DefaultHttpClient(); HttpPost request = new HttpPost(url); HttpResponse response = null; MultipartEntity mpe = new MultipartEntity(); try { Log.v("API", "URL:"+url); request.setHeader("Content-Type", "multipart/form-data"); request.addHeader("X-AUTHORIZATION",token); request.addHeader("Cache-Control", "no-cache"); DRPContentForUpload content = new DRPContentForUpload(file); String jsonObject = DRPJSONConverter.toJson(content); FormBodyPart part1= new FormBodyPart("file01", new StringBody(jsonObject)); FormBodyPart part2= new FormBodyPart("file01", new FileBody(file)); mpe.addPart(part1); mpe.addPart(part2); // request.setEntity(mpe); Log.v("RAW REQUEST", "request looks like:"+mpe.toString()); response = client.execute(request);
EDITAR
Fui capaz de hablar con mi equipo de API, y me dijeron que mi post realmente se ve así:
--0ieMJK6PPwcrM_K3KQvl6eNDGqooZPzJcvHOm0 Content-Disposition: form-data; name="file01" Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit {"mime_type":"image/jpeg","title":"IMG_20140131_111622"} --0ieMJK6PPwcrM_K3KQvl6eNDGqooZPzJcvHOm0 Content-Disposition: form-data; name="file01"; filename="IMG_20140131_111622.jpg" Content-Type: application/octet-stream Content-Transfer-Encoding: binary
Dicho esto, su aún no funciona y escupir de nuevo un error que estoy perdiendo params
Aquí hay una captura de pantalla de las bibliotecas incluidas en mi proyecto:
- ¿Cómo publicar pares clave / valor con una subida de archivo en android
- Android sube video a un servidor remoto usando datos de formulario multipart HTTP
- Java.io.IOException: final inesperado de la secuencia
- Retrofit Image Upload dar error
- Retrofit 2 La solicitud POST multipart envía cotizaciones extra a PHP
- Android twitter4j subir imagen
- Koush Ion Library - Subir Multipart / form-data con Progressbar, TimeoutException
- ¿Cómo subir datos de formulario de múltiples partes y la imagen al servidor en android?
Así que después de buscar alto y bajo para una respuesta, y casi renunciar, este enlace finalmente ayudó
Aquí está el código de trabajo final:
public HttpResponse invokeXAUTHPOSTService(String url, String token, File file) { client = new DefaultHttpClient(); HttpPost request = new HttpPost(url); HttpResponse response = null; DRPContentForUpload content = new DRPContentForUpload(file); String jsonObject = DRPJSONConverter.toJson(content); String BOUNDARY= "--eriksboundry--"; request.setHeader("Content-Type", "multipart/form-data; boundary="+BOUNDARY); request.addHeader("X-AUTHORIZATION",token); MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,BOUNDARY,Charset.defaultCharset()); try { entity.addPart("file01", new StringBody(jsonObject)); entity.addPart("file01", new FileBody(file)); request.addHeader("Accept-Encoding", "gzip, deflate"); } catch (UnsupportedEncodingException e) { Log.v("encoding exception","E::: "+e); e.printStackTrace(); } request.setHeader("Accept", "application/json"); request.setHeader("Content-Type", "multipart/form-data; boundary="+BOUNDARY); request.setEntity(entity); try { response = client.execute(request); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return response; }
¿Es el problema que el tipo MIME para su imagen no se está estableciendo correctamente? Intente utilizar el constructor alternativo para FileBody
:
FormBodyPart part2 = new FormBodyPart("file01", new FileBody(file, "image/jpeg"));
Dar a ambas partes de la solicitud de varias partes el mismo nombre es un poco sospechoso, pero no parece estar causando problemas aquí.
Si desea ver qué aspecto tiene su cuerpo antes de enviar, intente utilizar EntityUtils.toString (Entity) en la entidad de varias partes después de agregar todos los elementos. La imagen es simplemente binaria por lo que no se imprimirá muy bien, pero los encabezados deben ser legibles.