Subiendo archivos con HttpClient

Iniciado por Proteus1989, 27 Febrero 2012, 14:36 PM

0 Miembros y 1 Visitante están viendo este tema.

Proteus1989

Estoy escribiendo un par de lineas de código y me he encontrado con un problema.
Resumiendo este es el código

Código (java) [Seleccionar]
HttpClient cliente = new HttpClient();
String ruta = "Servidor";
PostMethod method = new PostMethod(ruta);

Part[] parts =
{ new FilePart("fileupload", archivo, "image/jpeg", "iso-8859-1") };
method.setRequestEntity(new MultipartRequestEntity(parts, method.getParams()));

entity = new CountingMultipartRequestEntity(method.getRequestEntity());

cliente.executeMethod(method);


Con eso consigo mi primer proposito, subir el archivo al servidor. El problema es que quiero monitorizar la subida con algún listener.
Ya he buscado varias cosas por google, pero no me aclaro con ninguna.

Alguna idea compañeros?

adastra

Creo que una buena opción, en este caso es utilizar el patrón Observer en Java, es simple:
Tienes un "Observador" y un objeto "Observado". Cuando el objeto observado sufra un cambio en su estructura (en tu caso cuando un cliente quiera subir un fichero) se disparará el evento notificando a todos los observadores interesados en lo que acaba de ocurrir, los observadores recibiran como parametro de dicho evento, el objeto que ha cambiado y podran ejecutar una rutina de código. (en tu caso, monitorizar quien ha realizado la subida).
Para toda esta "movida" (que en realidad es mas simple de lo que parece) cuentas con la clase "Observer" y la interfaz "Observable" en Java.
Fijate en este sencillo ejemplo:

https://unpocodejava.wordpress.com/2010/02/03/patron-observer/

Proteus1989

No quiero saber quien sube sino cuanto lleva subido.
De todas formas voy a ver el código a ver si saco algo en claro.

Gracias.

adastra

De igual forma el patron observer te sirve, puedes implementar un Timer en Java (en el objeto observado) y disparar el evento cuando lo quieras consultar (notificar a los observadores).
Creo que es una forma bastante limpia y sencilla de hacerlo.

Proteus1989

Y como se cuanto llevo subido al ejecutar
cliente.executeMethod(method);

Tengo que preguntarle a method? a cliente?

PD: La verdad es que la clase Observer y la interfaz Observable tienen su gracia :)

adastra

Si la tienen... jejeje

Puedes hacerlo con un Timer en Java, (que al final de cuentas es simplemente un Hilo que te va llevando la cuenta de cuanto tiempo lleva ejecutandose el proceso que le indiques)
De hecho, lo que quieres hacer es bastante frecuente y en aplicaciones stand-alone con Swing se suele implementar un Timer junto con un JProgressBar indicando el porcentaje (o en tu caso el tiempo) que lleva en ejecución la descarga y su progreso.
Tal vez esto te sirva:
http://www.chuidiang.com/java/timer/timer.php

Proteus1989

El problema es que quiero saber los bytes subidos, no el tiempo empleado en hacerlo xD
Suponiendo un archivo de 10 mb lo que quiero es que a cada instante aparezca cuanto porcentaje de la subida lleva completado en el progressbar.
Y si no he entendido mal lo que me explicas tu es como saber el tiempo de subida.

adastra

Si, el tiempo de subida o el número de bytes, lo que le quieras meter,
te he hablado lo que se ejecuta a nivel de presentación (interfaz grafica). Ahora en Apache HttpClient, obtener el número de bytes enviado se hace de la siguiente forma:

HostConfiguration conf = cliente.getHostConfiguration();
HttpConnection connection = cliente.getHttpConnectionManager().getConnection(conf);
int bytesEnviados = connection.getSendBufferSize();


La API  de HTTPClient es bastante completa, allí encontraras casi todo lo que necesitas
https://hc.apache.org/httpclient-3.x/apidocs/allclasses-noframe.html
Fijante en la clase HttpConnection, tiene información bastante util sobre el proceso de carga/descarga.

Proteus1989

Esas 3 líneas eran las que me traían la cabeza loca. Lo demás de una forma u otra lo habría implementando (ahora lo haré con el Observer xD)

Muchas gracias, me ha sido muy útil tu ayuda ;)

adastra

De nada  ;)
Que te diviertas con Java....

::)