2010-08-14 10 views
10

Tratando de descubrir qué hay de malo en mis codificaciones. Seguí una publicación de blog desde here.La publicación HTTP de varias partes de Android no envía el tipo MIME del archivo

Logré obtener los códigos para cargar el archivo en un servicio web PHP. Sin embargo, por alguna razón, aunque he establecido explícitamente el tipo MIME para el archivo, PHP muestra que el MIME es solo una cadena en blanco y, por lo tanto, se rechaza.

Aquí está mi codificaciones:

public String SendPost(String fn, String bid, String caption, String uid, String APIKey, String postHash) 
     throws ParseException, ClientProtocolException, IOException { 
    HttpClient httpclient = new DefaultHttpClient(); 
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 

    HttpPost httppost = new HttpPost(UrbURL); 

    Log.i("POSTFN", fn); 
    Log.i("POSTFN", bid); 
    Log.i("POSTFN", caption); 
    Log.i("POSTFN", uid); 
    Log.i("POSTFN", APIKey); 
    Log.i("POSTFN", postHash); 

    String postAuth = uid + postHash; 
    postAuth = md5(postAuth); 
    postAuth = postAuth.substring(0, 16); 
    //Log.i("POSTAUTH", postAuth); 

    MultipartEntity mp = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

    /*File tempImg = new File(fn); 
    FileBody bin = new FileBody(tempImg, "image/jpg");*/ 
    mp.addPart("business_photo", new FileBody(new File(fn), "image/jpg")); 

    //StringBody s = new StringBody(bid, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("business_id", new StringBody(bid, "text/plain", Charset.forName("UTF-8"))); 

    //s = new StringBody(caption, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("photo_caption", new StringBody(caption, "text/plain", Charset.forName("UTF-8"))); 

    //s = new StringBody(uid, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("user_id", new StringBody(uid, "text/plain", Charset.forName("UTF-8"))); 

    //s = new StringBody(APIKey, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("apikey", new StringBody(APIKey, "text/plain", Charset.forName("UTF-8"))); 

    //s = new StringBody(postAuth, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("auth", new StringBody(postAuth, "text/plain", Charset.forName("UTF-8"))); 

    httppost.setEntity(mp); 

    String response = EntityUtils.toString(httpclient.execute(httppost).getEntity(), "UTF-8"); 

    httpclient.getConnectionManager().shutdown(); 

    return response; 
} 

Muchas gracias :) antes

+0

Hola, ¿pueden decirme qué es 'charset' y qué le puse – SAndroidD

Respuesta

5

que tenía el mismo problema y simplemente lo arreglaron.

Encontré que usar el HttpMultipartMode.BROWSER_COMPATIBLE impedía que se estableciera el mimeType correcto en mi solicitud, cuando se usaba un ByteArrayBody para una imagen. Supongo que este es probablemente el mismo problema que estás teniendo.

Cuando cambié esta línea:

MultipartEntity mp = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

a

MultipartEntity mp = new MultipartEntity(); 

entonces el tipo MIME se estableció correctamente la carga y el servicio funcionó.

Veo que la gente usa el BROWSER_COMPATIBLE para resolver otro problema, pero con suerte no lo necesita.

+0

Esto me ayudó. ¡Muchas gracias! – pixelscreen

1

Tenemos el mismo problema aquí. El uso de HttpMultipartMode.BROWSER_COMPATIBLE eliminó el tipo mimet correcto que se envía.

Desafortunadamente no es una opción para nosotros utilizar el MultipartEntity() 'normal', ya que de esta forma los raíles de fondo entorpecen el manejo de las solicitudes.

¿Hay alguna manera de establecer el tipo de contenido de la multiparte usted mismo y usar HttpMultipartMode.BROWSER_COMPATIBLE ??

1

Tuve el mismo problema por un tiempo para publicar 3 FileBodies y 1 información de mimo, el mimo (en json) nunca se recibió a menos que enviara un solo filebody. Siempre agregué primero el filebody, lo que me causó el problema. Invertí el orden por addpart el mimo al principio y cada información que incluye mime se recibe correctamente en el servidor php.

1

En lugar de incluir los archivos jar, puede usar las clases http multipart definidas en android pero declaradas como internas, por lo que no puede usarlas directamente, debe descargarlas desde el android source code y agregarlas a su proyecto. Se deben realizar algunas modificaciones básicas antes de usarlas, nada difícil (cambie el nombre de los paquetes, elimine todas las llamadas al registrador ). Funciona perfectamente para mí. Espero que esto pueda ayudar a alguien,

+0

El enlace está roto. – Zammbi

1

Así que, si bien todas las respuestas anteriores ayudaron a hacerlo bien.

Pero solo eliminar HttpMultipartMode.BROWSER_COMPATIBLE no lo resolvería.

Puede establecer el tipo MIME al hacer esto

ByteArrayBody bab = new ByteArrayBody(params.getByteArray("data"), "image/jpeg" , "image.jpg"); 

N. B. Estoy utilizando el último cliente de Android empaquetado http://code.google.com/p/httpclientandroidlib/ que admite cargas múltiples, etc.

+0

Genial .... thanks.its realmente ahorra mi tiempo. –

2

Acabo de tener el mismo problema al actualizar HttpClient de la versión 4.1 a la versión 4.4. Ni la eliminación de HttpMultipartMode.BROWSER_COMPATIBLE ni el reemplazo con otras opciones alternativas ayudaron.

una solución que requiere el mínimo cambio para mí es especificar explícitamente el filename cuando se construye un FileBody, es decir, sustituir

new FileBody(file, mimeType) 

con

new FileBody(file, filename, mimeType, charset) 

En cuanto a la versión HttpClient 4.4, la razón podría sea ​​que new FileBody(file, mimeType) asigna null al campo filename en lugar de usar file.getName(). Luego, al ejecutar formatMultipartHeader en HttpMultipart, el filename de la parte que se va a formatear se verifica si no es nulo en el modo BROWSER_COMPATIBLE. Si es nulo, entonces se ignora todo el cuerpo.

Cuestiones relacionadas