• Publicidad

Upload múltiples archivos

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Upload múltiples archivos

Notapor seafree » 2015-03-26 10:34 @482

Hola. Para subir (guardar) varios archivos, ¿cuál es la sentencia correcta? Inicié subiendo un solo archivo de la siguiente manera:

#---Recibo el nombre del archivo a guardar
my $filename = $query->param('tipo_reporte');

my $upload_filehandle = $query->upload("tipo_reporte");

open ( UPLOADFILE, ">$upload_dir/$filename" ) or die "$!";
binmode UPLOADFILE;

while ( <$upload_filehandle> )
{
print UPLOADFILE;
}

close UPLOADFILE;


La pregunta es: ¿para subir múltiples archivos, la manera de hacerlo es por medio de un ciclo foreach()? ¿O existe un método propio para ello? Gracias.
Última edición por explorer el 2015-03-26 10:49 @492, editado 1 vez en total
Razón: cual => ¿cuál; inicie => inicié;
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Publicidad

Re: Upload múltiples archivos

Notapor explorer » 2015-03-26 11:00 @500

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: Upload múltiples archivos

Notapor seafree » 2015-04-01 16:21 @723

Gracias, excelente.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: Upload múltiples archivos

Notapor seafree » 2018-12-20 13:51 @618

Me encuentro batallando una vez más con el archivado de múltiples archivos.

El script para subir archivos ya funcionaba pero ahora tengo otra vez problemas en CENTOS 7. No sé si son permisos. Me aseguré que tiene los módulos requeridos instalados:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
# perl -MCGI::Carp -e "print \"Module installed.\\n\";"
Module installed.
 # perl -MFile::Basename -e "print \"Module installed.\\n\";"
Module installed.
# perl -MFile::Copy -e "print \"Module installed.\\n\";"
Module installed.
# perl -MCGI -e "print \"Module installed.\\n\";"
Module installed.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Prueba de instalación del CGI.pm:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
# find / -name CGI.pm -print 2>/dev/null
/usr/share/perl5/vendor_perl/CGI.pm
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Al parecer los problemas son los permisos para crear un directorio:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $upload_dir = "/var/www/html/public_html/cev/$inst/$anio-$mes-$dia";
  2. print "UPLOAD_DIR: $upload_dir <br><br>";
  3. mkdir $upload_dir, 0775;                   # BUG: NO SE CREA EL ARCHIVO
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Sabrás cuáles permisos se deben utilizar?
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: Upload múltiples archivos

Notapor explorer » 2018-12-20 17:05 @753

Es muy difícil ayudarte sin saber qué pasa.

Lo mejor que puedes hacer es colocar esta línea al principio del programa, tras la línea del "use CGI;":

use CGI::Carp qw'fatalsToBrowser';

De esa manera, los errores fatales saldrán en la página web de tu navegador, y así no necesitarás mirar los archivos log de actividad web, que parece que no sueles consultarles a menudo :wink: Una vez encontrado el fallo, quita la línea o déjala comentada.

Hay que recordar una máxima con el protocolo CGI. El servidor web es el que va a recibir la petición de ejecución del cgi. Este servidor está funcionando en tu ordenador bajo el nombre de un usuario. Bueno, pues el cgi se ejecutará con los permisos de ese usuario.

La carpeta donde se van a crear el directorio debe entonce tener los permisos suficientes para que el usuario que ejecuta el servidor web lo pueda hacer.

Más información
Más información
Más información
Más información
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: Upload múltiples archivos

Notapor seafree » 2019-01-07 12:19 @555

No puede ser. Batallando aún con la carga de archivos, considerando tus apoyos anteriores verifiqué los permisos del umask:

# vi /etc/profile
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi

1ª condición:
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

2ª condición:
root=root

La condición es falsa y entra al else.

Permisos donde se crearán los directorios para grabar los archivos:

# ls -l /var/www/html
drwxr-xr-x. 5 apache apache 4096 Dec 20 15:00 public_html

Verificación de la instalación del módulo File::Path para crear un estructura recursiva de directorios.

# yum install perl-File-Path
Package perl-File-Path-2.09-2.el7.noarch already installed and latest version
Nothing to do


Resultado de lo anterior no está permitiendo la ejecución del mkdir, por lo tanto no se crea el directorio dinámico donde se guardarán los archivos (upload).

Espero a ver aportado un poco al planteamiento original, espero contar con tu respetable apoyo. Gracias, explorer.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: Upload múltiples archivos

Notapor explorer » 2019-01-07 12:48 @575

Si TÚ programa no puede ejecutar el mkdir, es porque el USUARIO que ejecuta TÚ programa NO tiene permisos para escribir o modificar en el directorio donde quieres crear el subdirectorio.

Lo primero... ¿qué usuario ejecuta el servidor web? Pues es ESE el usuario que ejecutará tu cgi.

Luego, vemos que los permisos de /var/www/html/ es

drwxr-xr-x. 5 apache apache

que quiere decir que SÓLO el usuario apache tiene permisos de escritura/modificación en ESE directorio. ¿Es ese el usuario con el que se ejecuta el programa servidor web? Lo puedes saber si haces un ps y miras los procesos apache que estén funcionando.

¿Y el error? ¿Qué sale en el error.log del servidor web? ¿Qué error sale en la pantalla? (si has puesto el módulo use CGI::Carp qw'fatalsToBrowser';)

Otras condiciones que se deben dar:

¿El programa tiene permisos de ejecución?

¿El servidor web tiene permisos de ejecución de CGI en el directorio donde está tu programa? Esto depende de la conf. del servidor web.

Si el programa no se puede ejecutar de ninguna manera, éstas son unas de las primeras cosas que hay que mirar.

¡¡MIRA el error.log!! ¡Es tu amigo!
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: Upload múltiples archivos

Notapor seafree » 2019-01-22 16:57 @748

Ok, explorer. De acuerdo a tus comentarios te envío lo solicitado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
#ps -fea
apache   28014 12101  0 15:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root     28437     1  0  2018 ?        00:00:06 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
root     28599     2  0 15:20 ?        00:00:00 [kworker/u2:0-ev]
root     28931     1  0  2018 ?        00:00:00 /usr/lib/systemd/systemd-udevd
root     29325     2  0 15:30 ?        00:00:00 [kworker/0:1-eve]
root     29326     2  0 15:30 ?        00:00:00 [kworker/u2:1-ev]
root     29718     2  0 15:35 ?        00:00:00 [kworker/0:0-ata]
root     30083  7190  0 15:40 ?        00:00:00 sleep 60
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Y el error? ¿Qué sale en el error.log del servidor web?

[Tue Jan 22 15:28:20.569951 2019] [cgi:error] [pid 13417] [client…] AH01215: [Tue Jan 22 15:28:20 2019] upload_modif_ok.cgi: No such file or directory at /var/www/cgi-bin/####/upload_modif_ok.cgi line 45., referer: http://#.#.#.#/####/file_upload.html

Line 45: open ( UPLOADFILE, ">$upload_dir/$anio-$mes-$dia-$nombre_archivos[$ind]" ) or die "$!";
Las variables si tienen valor lo que no puede es crear el directorio

¿Qué error sale en la pantalla?
open ( UPLOADFILE, '>/var/www/html/public_html/cev/TTT/19-01-20/19-01-20-NI' ) or die 'Permission denied'
Software error:
No such file or directory at /var/www/cgi-bin/…/upload_modif_ok.cgi line 45.

Otras condiciones que se deben dar:

¿El programa tiene permisos de ejecución?
-rwxr-xr-x. 1 root root 3133 Jan 22 11:56 upload_modif_ok.cgi

¿El servidor web tiene permisos de ejecución de CGI en el directorio donde está tu programa? Esto depende de la conf. del servidor web.

<Directory "/var/www/cgi-bin">
AllowOverride all
Options None
Require all granted
</Directory>

Espero esto ayude en algo. Cabe recordar que estoy usando un servidor con CENTOS 7, donde la versión de Apache es 2.4.

Espero tus valiosos comentarios. Gracias y saludos.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: Upload múltiples archivos

Notapor explorer » 2019-01-22 18:37 @817

El mensaje de error dice que

"no encuentro un archivo o directorio indicado en la línea 45 de upload_modif_ok.cgi"

Es decir: el servidor web sí que encuentra tu cgi, y lo ejecuta, pero sale con un error que se produce dentro de él.

El error en pantalla nos da la mayor pista: Permiso denegado.

Es decir, ahí en la 45 intentas abrir un archivo en escritura, pero el cgi no lo consigue.

Tienes que comprobar que el usuario 'apache' tiene permisos para

  • ENTRAR en la carpeta /var/www/html/cev/TTT/19-01-20/

    Esto lo consigues fácilmente dando permisos de lectura y ejecución a todo el mundo en cada uno de esos subdirectorios

    Algo así: find /var/www/html -type d -exec chmod go+rx {} \;

    Ese comando pone los permisos a todos los subdirectorios de /var/www/html
  • ESCRIBIR dentro de 19-01-20/ (la carpeta que contendrá el archivo a abrir con el open()).

    Esto lo consigues dando permisos de escritura a todo el mundo en esa carpeta

    Algo así: chmod go+w /var/www/html/cev/TTT/19-01-20/

Si la carpeta 19-01-20/ la estás creando tú en el programa con el mkdir(), ejecuta luego, en el programa, un

chmod 0777, "19-01-20";

(importante, no te olvides del '0' inicial. Eso le indica a Perl de que se trata de un número en octal).

y así te ahorras el segundo paso indicado antes.

Resumen:
  • dale permisos de ejecución a los subdirectorios "fijos"
  • desde el programa, los subdirectorios que creas, dales permisos de ejecución y escritura si luego vas a crear archivos dentro.
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: Upload múltiples archivos

Notapor seafree » 2019-01-24 11:06 @504

Hola, explorer. Adicional a tu respuesta consideré las indicaciones aquí expuestas: http://proyectoa.com/establecer-permiso ... wordpress/

Gracia por tu apoyo. Saludos.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Siguiente

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados