Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Proteus1989 en 27 Febrero 2012, 14:36 pm



Título: Subiendo archivos con HttpClient
Publicado por: Proteus1989 en 27 Febrero 2012, 14:36 pm
Estoy escribiendo un par de lineas de código y me he encontrado con un problema.
Resumiendo este es el código

Código
  1. HttpClient cliente = new HttpClient();
  2. String ruta = "Servidor";
  3. PostMethod method = new PostMethod(ruta);
  4.  
  5. Part[] parts =
  6. { new FilePart("fileupload", archivo, "image/jpeg", "iso-8859-1") };
  7. method.setRequestEntity(new MultipartRequestEntity(parts, method.getParams()));
  8.  
  9. entity = new CountingMultipartRequestEntity(method.getRequestEntity());
  10.  
  11. 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?


Título: Re: Subiendo archivos con HttpClient
Publicado por: adastra en 27 Febrero 2012, 16:50 pm
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/


Título: Re: Subiendo archivos con HttpClient
Publicado por: Proteus1989 en 27 Febrero 2012, 16:58 pm
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.


Título: Re: Subiendo archivos con HttpClient
Publicado por: adastra en 27 Febrero 2012, 17:01 pm
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.


Título: Re: Subiendo archivos con HttpClient
Publicado por: Proteus1989 en 27 Febrero 2012, 17:05 pm
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 :)


Título: Re: Subiendo archivos con HttpClient
Publicado por: adastra en 27 Febrero 2012, 17:11 pm
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


Título: Re: Subiendo archivos con HttpClient
Publicado por: Proteus1989 en 27 Febrero 2012, 17:20 pm
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.


Título: Re: Subiendo archivos con HttpClient
Publicado por: adastra en 27 Febrero 2012, 17:32 pm
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:

Código:
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.


Título: Re: Subiendo archivos con HttpClient
Publicado por: Proteus1989 en 27 Febrero 2012, 17:35 pm
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 ;)


Título: Re: Subiendo archivos con HttpClient
Publicado por: adastra en 27 Febrero 2012, 17:38 pm
De nada  ;)
Que te diviertas con Java....

 ::)


Título: Re: Subiendo archivos con HttpClient
Publicado por: Proteus1989 en 28 Febrero 2012, 02:41 am
Antes no había probado el código que me has pasado y ahora que lo pruebo me doy cuenta de que el cliente que yo creo es un cliente por defecto y casi todos sus campos están a null entre ellos... los que necesito xD

Sabes como tendría que crear el cliente para que me devuelva los datos que necesito?

Ahora mismo tengo un new HttpClient() y un PostMethod(ruta del servidor) y el cliente.execute(method) Mi method es el que contiene la información sobre donde y como hay que subir, y supongo que al hacer el execute el cliente tirará de ahí.


PD: Me estoy volviendo más pesado que el mercurio.

EDIT: connection.getSendBufferSize(); no devolvería la longitud del buffer? Es decir, un valor constante?
EDIT2: Añadiéndole el host al HostConfiguration manualmente he conseguido que funcione pero como digo en el EDIT devuelve siempre el mismo valor, el tamaño de buffer.


Título: Re: Subiendo archivos con HttpClient
Publicado por: Debci en 3 Marzo 2012, 10:19 am
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/
Muy útil el patrón observer, nos libra de mucha morralla con los listeners, a veces incluso inexistentes.
Excelente respuesta.

Saludos


Título: Re: Subiendo archivos con HttpClient
Publicado por: Proteus1989 en 3 Marzo 2012, 17:39 pm
Pero si la clase HttpClient ya está implementada como le digo que extienda de Observable?