• Publicidad

Subir un fichero por FTP a mi página web

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Subir un fichero por FTP a mi página web

Notapor jcarranza » 2010-12-14 02:36 @150

Tengo una imagen JPG que me genera mi sistema cada vez que capturo un pase de satélite.

Me gustaría subir esta imagen por FTP a mi página web (se machacaría la existente del servidor web) cada vez que se genera.

El programa en Perl se estaría constantemente ejecutando en espera de la entrada de la nueva JPG.

¿Cómo se hace esto?

Es urgente. Saludos y gracias.

He cargado el package Net-Ftp-File.

De momento este es mi código pero no me funciona:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use Net::FTP;
  4.  
  5. $username = "mi_usuario";
  6. $pwd = "mi_passsword";
  7.  
  8. $ftp = Net::FTP->new("ftp.midominio.net") or die("No se pudo conectar al servidor: $!");
  9. $ftp->login($username,$pwd) or die("Login incorrecto: $!");
  10. #ACCIONES QUE QUEREMOS EJECUTAR EN EL SERVIDOR
  11.  
  12.  
  13. print "\nConectado al FTP. Pulse una tecla para continuar";
  14. $opcion=<STDIN>;
  15. chomp($opcion);
  16.  
  17.  
  18. #Una vez conectados, subimos la imagen JPG de interés.
  19. # debemos de encontarnos en el directorio donde queremos guardar el archivo: /httpdocs/quicklook
  20.  
  21. $ftp->cwd("httpdocs/quicklook/");
  22.  
  23.  
  24.  
  25. print "\nSituados en el directorio quicklook. Pulse una tecla para continuar";
  26. $opcion=<STDIN>;
  27. chomp($opcion);
  28.  
  29.  
  30.  
  31. $ftp->put("quicklook_ultimo.jpg","quicklook_ultimo.jpg");
  32.  
  33. print "\nSubido el archivo JPG. Pulse una tecla para continuar";
  34. $opcion=<STDIN>;
  35. chomp($opcion);
  36.  
  37. $ftp->quit or die("No se puedo desconectar del servidor: $!");
  38.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Lo que ocurre es que la JPG subida no corresponde con la JPG original, está totalmente distorsionada. ¿cómo lo soluciono?

¡¡Saludos!!
jcarranza
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2010-04-20 05:00 @250

Publicidad

Re: Subir un fichero por FTP a mi página web

Notapor explorer » 2010-12-14 05:03 @252

El programa está usando Net::FTP, no Net::FTP::File. Y seguro que ese módulo ya lo tienes instalado.

¿En qué sistema operativo estás? Si estás en Windows o si el servidor es Windows quizás debas activar el modo de transporte binario. Pon esta línea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $ftp->binary();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Subir un fichero por FTP a mi página web

Notapor jcarranza » 2010-12-14 06:24 @308

Efectivamente, tengo Windows y poniendo esta línea antes de put() ya me funciona perfectamente.

¡¡Muchíiiiiiiisimas gracias!!!



Ahora una cuestión para la ejecución. Este fichero cambia cada cierto tiempo en su directorio madre. ¿Cómo puedo indicarle al script Perl que se ejecute cada vez que detecte el cambio en este fichero JPG?

¿Programarías mejor una tarea Windows?


¡¡Saludos!!!
jcarranza
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2010-04-20 05:00 @250

Re: Subir un fichero por FTP a mi página web

Notapor explorer » 2010-12-14 10:11 @466

Si no es muy urgente, sí, programaría una Tarea programada en Windows.

Pero, si fuera muy urgente que el fichero esté arriba lo antes posible, o si vas a poner la Tarea programada para que funcione a un ritmo rápido (un minuto o así), preferiría tener funcionando el programa todo el tiempo.

Lo que haría (en el caso de vigilar a un solo fichero. Si es vigilar varios ficheros o un directorio entero se hace de otra manera) es pedirle al propio sistema operativo que vigile a ese fichero, y que me avise cuando haya cambiado. Vamos, que nos lo haga casi todo ;)

Esto se hace, en Windows, con el módulo Win32::FileNotify, así (no probado):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!Perl
  2. use Win32::FileNotify;
  3. use Net::FTP;
  4.  
  5. my $fichero = 'D:/Captura/Imagenes/quicklook_ultimo.jpg';     # ruta completa al fichero
  6. my $notify;
  7.  
  8. while ("felices para siempre") {                              # bucle infinito
  9.  
  10.     # <- aquí ponemos el código de subir el fichero al servidor
  11.  
  12.     # ahora esperaremos a que cambie en el disco
  13.     $notify = Win32::FileNotify->new( $fichero );             # pedimos a Windows que lo vigile
  14.     $notify->wait;                                            # y nos quedamos esperando
  15. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Como ves, se trata de hacer un bucle infinito, en el que nos quedamos esperando por cambios en el fichero y luego lo subimos inmediatamente, y volvemos a repetir.

Este programa la arrancamos un web y lo dejamos funcionando. Podríamos hacer que sacara una línea en la consola para informar de cuándo lo ha subido. Por ejemplo,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use POSIX qw(strftime);
# ...

    print strftime("%a %b %e %H:%M:%S %Y", localtime), " Fichero subido\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Así, el usuario ve la actividad del programa.

Queda todo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!Perl
  2. #
  3. # Vigilar un fichero, en sistemas Windows, y en cada cambio subirlo por FTP
  4. # Joaquín Ferrero, 20101214.
  5. #
  6. use strict;
  7. #use warnings;
  8. #use diagnostics;
  9.  
  10. use Net::FTP;
  11. use POSIX qw(strftime);
  12. use Win32::FileNotify;
  13.  
  14. $|++; # no caché
  15.  
  16. ### Configuración del programa ###
  17. # Acceso al servidor FTP
  18. my $ftp_servidor     = 'ftp.compuglobalhipermega.net';
  19. my $ftp_directorio   = 'httpdocs/quicklook/';
  20. my $ftp_usuario      = 'yo_mismo';
  21. my $ftp_clave        = 'OhMyDear';
  22.  
  23. my $ruta    = 'D:/Captura/Imagenes';     # ruta al fichero a vigilar
  24. my $fichero = 'quicklook_ultimo.jpg';    # el vigilado
  25.  
  26. ### Fin de la configuración ###
  27.  
  28. ### Variables
  29. my $ftp;
  30. my $notify;
  31.  
  32. ### Subrutinas
  33. sub timestamp {
  34.     print strftime("%a %b %e %H:%M:%S %Y", localtime), "  ", $_[0];
  35. }
  36.  
  37. ### Proceso
  38. while ( 1 ) {
  39.     print timestamp("Conectando con el servidor $ftp_servidor");
  40.     unless ($ftp = Net::FTP->new($ftp_servidor)) {
  41.         print timestamp("ERROR: No se pudo conectar al servidor: $@\n");
  42.         sleep 30;
  43.         next;
  44.     }
  45.     print "  Ok\n";
  46.  
  47.     print timestamp("Identificación como $ftp_usuario");
  48.     unless ($ftp->login($ftp_usuario, $ftp_clave)) {
  49.         print timestamp('ERROR: Login incorrecto: ' . $ftp->message . "\n");
  50.         sleep 30;
  51.         next;
  52.     }
  53.     print "  Ok\n";
  54.  
  55.     print timestamp("Entrando en $ftp_directorio");
  56.     unless ($ftp->cwd($ftp_directorio)) {
  57.         print timestamp("ERROR: No puedo entrar en el directorio $ftp_directorio: " . $ftp->message . "\n");
  58.         sleep 30;
  59.         next;
  60.     }
  61.     print "  Ok\n";
  62.  
  63.     print timestamp('Subiendo fichero');
  64.     unless($ftp->put("$ruta/$fichero")) {
  65.         print timestamp("ERROR: No puedo subir el fichero $fichero: " . $ftp->message . "\n");
  66.         sleep 30;
  67.         next;
  68.     }
  69.     print "  Ok\n";
  70.  
  71.     $ftp->quit();
  72.  
  73.     print timestamp("Esperando\n");
  74.     $notify = Win32::FileNotify->new( "$ruta/$fichero" );    # pedimos a Windows que lo vigile
  75.     $notify->wait;                                           # y nos quedamos esperando
  76. }
  77.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Subir un fichero por FTP a mi página web

Notapor jcarranza » 2010-12-20 04:18 @221

Finalmente lo he hecho como una tarea de Windows y va de maravilla.

Ahora quiero añadirle una nueva funcionalidad: quiero que me envíe un email cuando haya completado la subida a las 16:00h que es cuando finaliza la tarea de Windows.

De momento me quiero centrar en el envío de un sencillo mensaje a mi email y tengo esto pero no me funciona porque no sé qué poner en smtp:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use Mail::Sendmail;
  5.  
  6. # Creamos el hash con nuestro mensajes
  7. my %mail = (
  8. From => '[email protected]',
  9. Subject => 'Prueba email con perl',
  10. Message => 'Esto es una prueba',
  11. Smtp => 'localhost'
  12. );
  13.  
  14. # Envíar el mensaje
  15. unless (sendmail(%mail)) {
  16. # Error!
  17. print "ERROR\n";
  18. exit(1);
  19. }
  20.  
  21. # Envío correcto.
  22. print "OK\n";
  23. exit(1);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



¡¡Saludos!!
jcarranza
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2010-04-20 05:00 @250

Re: Subir un fichero por FTP a mi página web

Notapor explorer » 2010-12-20 07:56 @372

Mail::Sendmail es un poco viejo... la opción smtp sirve para indicarle al módulo cuál es tu servidor de correo, aquel servidor que se ocupará de recoger tu correo electrónico y enviarlo al destinatario.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Subir un fichero por FTP a mi página web

Notapor jcarranza » 2010-12-20 08:20 @388

¿Y qué me aconsejas?

¡¡Saludos!!
jcarranza
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2010-04-20 05:00 @250

Re: Subir un fichero por FTP a mi página web

Notapor explorer » 2010-12-20 09:44 @447

Pues que pongas ahí el nombre del servidor de correo que tengas contratado.

Lo malo de este módulo es que no soporta SMTP AUTH, por lo que, si el servidor requiere autenticación, no te dejará enviar ningún correo.

Otra opción es usar otro módulo que dependa de Net::SMTP, y podrás enviar el correo desde tu propio ordenador. Pero en algunas redes, eso se considerará SPAM, y a tu proveedor de Internet no lo gustará nada y quizás te filtre tu dirección.

Para enviar un correo muy sencillo, puedes usar Email::Sender. Y deberás elegir el método de transporte (transport) del mensaje. Lo más cómodo es la primera opción comentada: usar el servidor SMTP que tengas contratado. Email::Sender::Simple es una versión simple del módulo Email::Sender.

Tienes un ejemplo en el hilo Enviar Mail con archivo adjunto.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado