¿Se ha enviado al servidor el contenido-longitud no válido?

Estoy tratando de subir una foto al popular servicio Dailybooth a través de su nueva API a través del método documentado aquí .

El problema es que el servidor está respondiendo con:

<html><head><title>411 Length Required</title>... 

El código que estoy usando para enviar estos datos está aquí:

 // 2: Build request HttpClient httpclient = new DefaultHttpClient(); SharedPreferences settings = DailyboothShared.getPrefs(DailyboothTakePhoto.this); String oauth_token = settings.getString("oauth_token", ""); HttpPost httppost = new HttpPost( "https://api.dailybooth.com/v1/pictures.json?oauth_token=" + oauth_token); Log.d("upload", "Facebook: " + facebook); Log.d("upload", "Twitter: " + twitter); try { InputStream f = getContentResolver().openInputStream(snap_url); MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); entity.addPart("picture", new InputStreamBody(f, snap_url.getLastPathSegment())); entity.addPart("blurb", new StringBody(blurb)); entity.addPart("publish_to[facebook]", new StringBody(facebook)); entity.addPart("publish_to[twiter]", new StringBody(twitter)); httppost.setEntity(entity); HttpResponse response = httpclient.execute(httppost); Log.d("upload", response.toString()); int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == 200) { // do something? } else { Log.d("upload", "Something went wrong :/"); } Log.d("upload", EntityUtils.toString(response.getEntity())); } catch (Exception ex) { ex.printStackTrace(); } 

No tengo ni idea de lo que estoy haciendo mal.

Está utilizando clases StringBody y InputStreamBody que describen el contenido de su MultipartEntity. Mirando las fuentes, StringBody.getContentLength() devuelve la longitud de la cadena, pero InputStreamBody siempre devuelve -1 , y supongo que esto se hace para el caso de que necesites subir algunos datos al servidor sin saber el tamaño de la misma, y empiece a cargar mientras los datos lleguen al flujo.

Si desea poder configurar la longitud del contenido, entonces necesita saber el tamaño de su flujo de antemano, lo que puede hacer si ese es el caso es configurar el InputStreamBody esa manera:

 new InputStreamBody(f, snap_url.getLastPathSegment()) { public long getContentLength() { return /*your length*/; } } 

o volcar su flujo en una matriz de byte[] y pasar ByteArrayInputStream a la InputStreamBody , por supuesto, haciendo que pierda la capacidad de streaming, ya que necesita para almacenar en caché sus datos en la memoria antes de enviarlo más …

Como usted dijo que está trabajando en las imágenes, son estas imágenes de File por casualidad? Si es así también tiene FileBody que devuelven el content-length correcto content-length .

  • Cómo liberar la cámara cuando la gente deje de usar su widget?
  • ¿Cómo suprimir la advertencia de Gradle en Android Studio?
  • Recuperar android.os.Build ... propiedades del sistema mediante la aplicación puramente nativa de Android
  • TextView setGravity () no funciona en java
  • El recurso <número de ID de recurso> tipo 0x12 no es válido
  • Cómo pasar una gran colección entre actividades (flujo de detalle maestro)
  • Cómo crear sqlite declaración preparada en OrmLite?
  • Android setOnclicklistener parámetro
  • Algoritmo de coincidencia de patrones de forma en Java
  • Vista de lista personalizada de Android
  • Una cola de tareas de fondo en rxjava
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.