2010-07-29 12 views
11

Este es mi código.Cómo usar multipart/form-data carga de imagen/imagen en Android

Recibí Http 400 error, ¿alguien puede ayudarme?

HttpClient httpClient; 
HttpPost  httpPost; 
HttpResponse response; 
HttpContext localContext; 
FileEntity tmp = null; 
String  ret = null; 

httpClient = new DefaultHttpClient(); 
httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109) ; 

httpPost = new HttpPost(url); 
tmp  = new FileEntity(data,"UTF-8"); 

httpPost.setEntity(tmp); 
httpPost.setHeader("Content-Type", "multipart/form-data"); 
httpPost.setHeader("access_token", facebook.getAccessToken()); 
httpPost.setHeader("source",  data.getAbsolutePath()); 
httpPost.setHeader("message",  "Caption for the photo"); 

localContext = new BasicHttpContext(); 
response  = httpClient.execute(httpPost,localContext); 

bobince, gracias esta es mi nueva identificación, voy a tratar de poner OAuth a mi cabecera de la conexión.

Y este es mi código anterior, lo actualizaré pronto.

private void uploadPicture() throws ParseException, IOException { 
    HttpClient httpclient = new DefaultHttpClient(); 
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 

    HttpPost httppost = new HttpPost("https://graph.facebook.com/me/photos"); 
    File file = new File(sdpicturePath); 

    // DEBUG 
    Log.d("TSET", "FILE::" + file.exists()); // IT IS NOT NULL 
    Log.d("TEST", "AT:" + fbAccessToken); // I GOT SOME ACCESS TOKEN 

    MultipartEntity mpEntity = new MultipartEntity(); 
    ContentBody cbFile  = new FileBody(file, "image/png"); 
    ContentBody cbMessage  = new StringBody("TEST TSET"); 
    ContentBody cbAccessToken = new StringBody(fbAccessToken); 

    mpEntity.addPart("access_token", cbAccessToken); 
    mpEntity.addPart("source",  cbFile  ); 
    mpEntity.addPart("message",  cbMessage );   

    httppost.setEntity(mpEntity); 

    // DEBUG 
    System.out.println("executing request " + httppost.getRequestLine()); 
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity resEntity = response.getEntity(); 

    // DEBUG 
    System.out.println(response.getStatusLine()); 
    if (resEntity != null) { 
     System.out.println(EntityUtils.toString(resEntity)); 
    } // end if 

    if (resEntity != null) { 
     resEntity.consumeContent(); 
    } // end if 

    httpclient.getConnectionManager().shutdown(); 
} // end of uploadPicture() 
+0

algún cuerpo me ayuda ... – Joseph

+0

Hola, ¿cómo resolvió este problema? Estoy enfrentando el mismo problema ahora. –

Respuesta

8

setEntity establece la fuente de todo el cuerpo de la petición, por lo que este sólo funciona si el archivo fue un data ya codificados multipart/form-data bloque.

Para crear un envío de formulario codificado multipart/form-data para usar como cuerpo de solicitud POST, necesitará un codificador multiparte MIME, generalmente org.apache.http.entity.mime.MultipartEntity. Desafortunadamente, esto no viene incluido en Android, por lo que, si lo deseas, deberás ingresar un nuevo HttpClient de Apache.

Vea this question para el código de ejemplo y this thread para el fondo.

+0

Muchas gracias Bobince, lo intento ahora.^___^ – Joseph

+0

¡¡Genial !! pero ahora recibí un error por este ... >> {"error": {"tipo": "OAuthException", "mensaje": "Token de acceso OAuth no válido."}} – Joseph

+1

OAuth es un problema de nivel de aplicación, nada para hacer con la carga de archivos o la creación de formularios. Parece que debes pasar ['oauth_' headers] (http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iv-signing-requests/) con la solicitud para autorizar el acceso al usuario datos. – bobince

3

No es mi solución de trabajo para el envío de la imagen con el poste, utilizando librerías de Apache HTTP:

  ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
      byte[] imageBytes = baos.toByteArray(); 

      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(StaticData.AMBAJE_SERVER_URL + StaticData.AMBAJE_ADD_AMBAJ_TO_GROUP); 

      String boundary = "-------------" + System.currentTimeMillis(); 

      httpPost.setHeader("Content-type", "multipart/form-data; boundary="+boundary); 

      ByteArrayBody bab = new ByteArrayBody(imageBytes, "pic.png"); 
      StringBody sbOwner = new StringBody(StaticData.loggedUserId, ContentType.TEXT_PLAIN); 
      StringBody sbGroup = new StringBody("group", ContentType.TEXT_PLAIN); 

      HttpEntity entity = MultipartEntityBuilder.create() 
        .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) 
        .setBoundary(boundary) 
        .addPart("group", sbGroup) 
        .addPart("owner", sbOwner) 
        .addPart("image", bab) 
        .build(); 

      httpPost.setEntity(entity); 

      try { 
       HttpResponse response = httpclient.execute(httpPost); 
       ...then reading response 
1

como para Facebook Graph API, este código funciona perfecto. sin embargo, a veces, necesita usar nombre en lugar de nombre de archivo, la API gráfica parece entrar en conflicto con el documento rfc.

final String BOUNDERY = "3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f"; 
final String CRLF = "\r\n"; 
StringBuilder sbBody_1 = new StringBuilder(); 
sbBody_1.append("--" + BOUNDERY + CRLF); 
sbBody_1.append("Content-Disposition: form-data; filename=\"source\"" + CRLF); 
sbBody_1.append(CRLF); 
StringBuilder sbBody_2 = new StringBuilder(); 
sbBody_2.append(CRLF + "--" + BOUNDERY + "--"); 
URL url = new URL("https://graph.facebook.com/me/photos?access_token=" + accessToken); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setDoOutput(true); 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDERY); 
connection.setChunkedStreamingMode(0); 
OutputStream out = new BufferedOutputStream(connection.getOutputStream()); 
out.write(sbBody_1.toString().getBytes()); 
out.write(bFile);// bFile is byte array of the bitmap 
out.write(sbBody_2.toString().getBytes()); 
out.close(); 
BufferedReader bips = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
String temp = null; 
while ((temp = bips.readLine()) != null) { 
    Log.d("fbnb", temp); 
} 
bips.close(); 
connection.disconnect();