El envío de imágenes mediante Http Post

Quiero enviar una imagen desde el android de cliente para el servidor Django mediante Http Post. La imagen elegida es el de la galería. En la actualidad, estoy utilizando el valor de la lista de Pares de nombres para enviar los datos necesarios para el servidor y recibir respuestas de Django en JSON. Puede el mismo enfoque utilizado para las imágenes (con direcciones url de las imágenes incrustadas en respuestas JSON)?

También, que es un método mejor: el acceso a las imágenes de forma remota sin necesidad de descargar del servidor o de descargar y almacenar en un mapa de bits de la matriz y el uso de ellos a nivel local? Las imágenes son pocos en número (<10) y de tamaño pequeño (50*50 dip).

Algún tutorial para hacer frente a estos problemas sería muy apreciada.

Edit: Las imágenes elegidas de la galería se envían al servidor después de escalar al tamaño deseado.

5 Kommentare

  1. 143

    Voy a asumir que usted sabe la ruta de acceso y nombre de archivo de la imagen que desea cargar. Agregar esta cadena a su NameValuePair utilizando image como el nombre de clave.

    El envío de imágenes se puede hacer uso de la HttpComponents bibliotecas. Descargar la última HttpClient (actualmente 4.0.1) binario con las dependencias del paquete y copia apache-mime4j-0.6.jar y httpmime-4.0.1.jar a su proyecto y agregarlos a su Java build path.

    Usted tendrá que añadir la siguiente de las importaciones para su clase.

    import org.apache.http.entity.mime.HttpMultipartMode;
    import org.apache.http.entity.mime.MultipartEntity;
    import org.apache.http.entity.mime.content.FileBody;
    import org.apache.http.entity.mime.content.StringBody;

    Ahora usted puede crear un MultipartEntity para adjuntar una imagen a su solicitud POST. El siguiente código muestra un ejemplo de cómo hacerlo:

    public void post(String url, List<NameValuePair> nameValuePairs) {
        HttpClient httpClient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpPost httpPost = new HttpPost(url);
    
        try {
            MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    
            for(int index=0; index < nameValuePairs.size(); index++) {
                if(nameValuePairs.get(index).getName().equalsIgnoreCase("image")) {
                    //If the key equals to "image", we use FileBody to transfer the data
                    entity.addPart(nameValuePairs.get(index).getName(), new FileBody(new File (nameValuePairs.get(index).getValue())));
                } else {
                    //Normal string data
                    entity.addPart(nameValuePairs.get(index).getName(), new StringBody(nameValuePairs.get(index).getValue()));
                }
            }
    
            httpPost.setEntity(entity);
    
            HttpResponse response = httpClient.execute(httpPost, localContext);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    Espero que esto les ayude un poco en la dirección correcta.

    • Como he mencionado anteriormente, las imágenes que yo voy a enviar son de pequeño tamaño. Para qué necesito para utilizar MultiPartEntity de enviarlos?
    • Yo definitivamente recomendaría este. De esta manera usted probablemente puede utilizar Django características para recibir la imagen y guardarla fácilmente. Otra forma sería la de codificar la secuencia de bytes de la imagen a una cadena codificada en base64 y decodificar el lado del servidor. Pero esto sería demasiado de un molestia en mi opinión, y no el camino a seguir.
    • Las imágenes elegidas de la galería se envían al servidor después de escalar hasta los 50*50 dip. Así que no tengo una ruta de acceso para agregar a la lista el nombre de los valores de los pares. Tan sólo el segundo enfoque que usted ha mencionado, parece posible.
    • Usted puede guardar la imagen en un archivo temporal, o si desea omitir todo esto, usted podría tomar un vistazo a androidcodemonkey.blogspot.com/2010/03/…. Esto se describe cómo utilizar codificar en Base64. Usted sólo puede usar eso como una cuerda y saltar mi MultipartEntity ejemplo.
    • Yo soy el envío de las imágenes, utilizando este enfoque sólo yo.e Filebody pero da OutOfMemory Excepción, mientras que la carga de imágenes. Es allí cualquier manera que se puede manejar eso.
    • Hola chicos, ¿hay alguna manera de hacer esto sin MultipartEntity? Yo REALMENTE no desea importar todos los de Apache HC sólo para las 4 clases. 🙁
    • Por el momento, no que yo sepa. Usted podría ir con la codificación en base64 y justo después de que una cadena de datos a su servidor y decodificar en el backend. De esa manera usted no necesita importar el .del tarro.
    • Para enviar la imagen podemos convertir a la matriz de bytes, a continuación, crear nuevas ByteArrayBody (ver Interfaz ContentBody) y agregarlo a la multi-parte de la entidad. Ver a mi post.
    • Para FileBody la Content-Type siempre parece ser application/octet-stream a pesar de que sería necesario que sea image/jpeg. Alguna sugerencia sobre cómo podría solucionar eso?
    • Sólo añadir un 2º parámetro para FileBody con su deseada Tipo Mime. E. g.: new FileBody(new File (nameValuePairs.get(index).getValue()), "image/jpeg")
    • Parece multipartentity está en desuso?
    • no puedo encontrar apache-mime en el enlace de descarga? no es necesario?
    • Parece que está acoplado en httpmime-4.3.2.jar ahora. Así que supongo que de hecho no la necesito. Déjeme saber si este es el caso y voy a actualizar la respuesta. Gracias por el aviso!
    • Yo estaba pensando acerca de la edición de su respuesta. Varias partes de la entidad, se deprecia a lo largo de la cadena del cuerpo de la versión que está utilizando. La razón por la que no estoy de edición es porque me couldnot se unen todos los datos en namevaluepairs como lo han hecho.
    • Bien, voy a mirar en él y ver lo que ha cambiado. Gracias!
    • MultipartEntity obsoleto el uso de MultipartEntityBuilder.
    • su filenotfoundexception .. por favor dime cómo pasar de la imagen de tarjeta sd
    • hola alguien puede proporcionar un poco de ayuda tengo que subir tanto el perfil de archivo de imagen y detalles básicos para servidor utilizando después de la methode por favor me ayude
    • acaba de pasar esos detalles en como nameValuePairs. Sólo el que se denomina «imagen» será tratado como un archivo. También, UNA y MIL VECES UPVOTED!!!

  2. 14

    Versión 4.3.5 Código Actualizado

    • httpclient-4.3.5.jar
    • httpcore-4.3.2.jar
    • httpmime-4.3.5.jar

    Desde MultipartEntity ha sido obsoleto. Por favor, consulte el código de abajo.

    String responseBody = "failure";
    HttpClient client = new DefaultHttpClient();
    client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    
    String url = WWPApi.URL_USERS;
    Map<String, String> map = new HashMap<String, String>();
    map.put("user_id", String.valueOf(userId));
    map.put("action", "update");
    url = addQueryParams(map, url);
    
    HttpPost post = new HttpPost(url);
    post.addHeader("Accept", "application/json");
    
    MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    builder.setCharset(MIME.UTF8_CHARSET);
    
    if (career != null)
        builder.addTextBody("career", career, ContentType.create("text/plain", MIME.UTF8_CHARSET));
    if (gender != null)
        builder.addTextBody("gender", gender, ContentType.create("text/plain", MIME.UTF8_CHARSET));
    if (username != null)
        builder.addTextBody("username", username, ContentType.create("text/plain", MIME.UTF8_CHARSET));
    if (email != null)
        builder.addTextBody("email", email, ContentType.create("text/plain", MIME.UTF8_CHARSET));
    if (password != null)
        builder.addTextBody("password", password, ContentType.create("text/plain", MIME.UTF8_CHARSET));
    if (country != null)
        builder.addTextBody("country", country, ContentType.create("text/plain", MIME.UTF8_CHARSET));
    if (file != null)
        builder.addBinaryBody("Filedata", file, ContentType.MULTIPART_FORM_DATA, file.getName());
    
    post.setEntity(builder.build());
    
    try {
        responseBody = EntityUtils.toString(client.execute(post).getEntity(), "UTF-8");
    // System.out.println("Response from Server ==> " + responseBody);
    
        JSONObject object = new JSONObject(responseBody);
        Boolean success = object.optBoolean("success");
        String message = object.optString("error");
    
        if (!success) {
            responseBody = message;
        } else {
            responseBody = "success";
        }
    
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        client.getConnectionManager().shutdown();
    }
    • Que tarro de paquetes es necesario?
    • httpclient-4.3.5.jar httpcore-4.3.2.jar httpmime-4.3.5.jar
    • ¿Qué addQueryParams retorno ?
  3. 10

    La loopj biblioteca puede ser utilizada directa para este propósito:

    SyncHttpClient client = new SyncHttpClient();
    RequestParams params = new RequestParams();
    params.put("text", "some string");
    params.put("image", new File(imagePath));
    
    client.post("http://example.com", params, new TextHttpResponseHandler() {
      @Override
      public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
        //error handling
      }
    
      @Override
      public void onSuccess(int statusCode, Header[] headers, String responseString) {
        //success
      }
    });

    http://loopj.com/

  4. 5

    He luchado mucho tratando de poner en práctica la publicación de una imagen de Android cliente servlet mediante httpclient-4.3.5.jar, httpcore-4.3.2.jar, httpmime-4.3.5.jar. Yo siempre tengo un error en tiempo de ejecución. Me enteré de que, básicamente, no se puede utilizar estos frascos con Android como Google está utilizando una versión antigua de HttpClient en Android. La explicación está aquí http://hc.apache.org/httpcomponents-client-4.3.x/android-port.html. Usted necesita para obtener la httpclientandroidlib-1.2.1 frasco de android http-biblioteca de cliente. A continuación, cambiar sus importaciones de o.apache.http.cliente de ch.boye.httpclientandroidlib. Espero que esto ayude.

  5. -13

    Me suelen hacer esto en el hilo de la manipulación de la respuesta en json:

    try {
      Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent());
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

    Si usted necesita para hacer transformaciones en la imagen que usted desea crear una Imagen en lugar de un mapa de bits.

    • La pregunta es cómo publicar una imagen, y no cómo conseguirlo.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea