• Publicidad

UPLOADFILE 0 bytes

¿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.

UPLOADFILE 0 bytes

Notapor seafree » 2018-07-12 15:33 @689

Hola, estoy guardando archivos vía web desde Perl y efectivamente los guarda pero con 0 bytes, el panorama es el siguiente:

El directorio se encuentra creado con los siguientes permisos:
drwxrwxrwx 4 root root 26 Jul 10 15:03 Directorio_Destino

En el directorio anterior creé dos directorios más:
drwxrwxrwx 5 root root 51 Jul 12 13:37 D1
drwxrwxrwx 4 root root 36 Jul 12 14:37 D2


En los directorios anteriores se crean directorios de acuerdo a la fecha que se elija:
drwxr-xr-x 2 apache apache 68 Jul 12 14:30 18-05-01
drwxr-xr-x 2 apache apache 68 Jul 12 14:37 18-05-02


Y en el directorio recién creado, y de acuerdo a la fecha seleccionada, se guardan los archivos seleccionados, PERO con 0 bytes:

-rw-r--r-- 1 apache apache 0 Jul 12 14:44 18-05-02-VIDEO
-rw-r--r-- 1 apache apache 0 Jul 12 14:44 18-05-02-FOTO
-rw-r--r-- 1 apache apache 0 Jul 12 14:44 18-05-02-AUDIO

El código que utilizo para guardar los archivos es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         $upload_filehandle = $_;
  2.         copy $upload_filehandle, $anio-$mes-$dia-$nombre_archivos[$ind];
  3.         open ( UPLOADFILE, ">$upload_dir/$anio-$mes-$dia-$nombre_archivos[$ind]" )
  4.               or die "$!";
  5.         binmode UPLOADFILE;
  6.         while ( <$upload_filehandle> ) {
  7.               print UPLOADFILE;
  8.         }
  9.         close UPLOADFILE;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

PERO LOS ARCHIVOS SE GUARDAN CON 0 BYTES. ¿Alguien tendrá una idea sobre ello?

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

Publicidad

Re: UPLOADFILE 0 bytes

Notapor explorer » 2018-07-12 21:14 @926

El problema que tenemos es que no sabemos algunas cosas del código.

¿Qué valor tiene $_ al entrar en esas líneas?

¿Qué es o de dónde sale la función copy? ¿No faltan comillas dobles en el segundo argumento?

Si los archivos se crean con 0 bytes es que el open() y el close() han funcionado. Así que lo que falla es el print(). Más bien diríamos que el programa no ejecuta ningún print(), por lo que podemos pensar que el while() falla, o sea, que $upload_filehandle está cerrado, en caso de que almacene un identificador de archivo abierto antes.

Yo, lo que sospecho, es que copy() es del módulo File::Copy. Si es así, en la documentación se dice que si el primer argumento de copy() es un identificador de archivo, éste será el que se lea para guardarse en el destino.

O sea... que se lee el archivo ENTERO y se guarda en un nuevo archivo indicado por el segundo argumento. PERO... a continuación haces un open()... provocando que el archivo destino se ponga a 0. Y ya no entra en el while() porque el identificador de archivo llegó al final de archivo por efecto del copy() anterior.

En resumen: que estás copiando el archivo dos veces, y a la segunda, lo estás poniendo a cero.

Yo probaría a usar algo sencillo, sin File::Copy (sacado de la página de manual de CGI) (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $upload_filehandle = upload('nombre_campo_subida_archivo');  # aquí depende de cómo obtengas el identificador
  2. if (defined $upload_filehandle) {
  3.     my $name_file = "$anio-$mes-$dia-$nombre_archivos[$ind]";    # definimos el nombre destino
  4.     my $io_handle = $upload_filehandle->handle;                  # pasamos el identificador a uno tipo IO::Handle
  5.  
  6.     open my $OUTFILE, '>', $name_file;                           # abrir
  7.     binmode $OUTFILE;                                            # trabajar en modo binario
  8.     my $bytesread;
  9.     my $buffer;
  10.     while ($bytesread = $io_handle->read($buffer, 4096)) {       # leer en bloques de 4 KB
  11.         print $OUTFILE $buffer;                                  # y guardar
  12.     }
  13.     close $OUTFILE;                                              # cerrar
  14. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Usando File::Copy, quizás sea más corto (te ahorras todas las líneas entre open() y close(), incluidas). Sería tan corto -no lo he probado- como
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. copy($upload_filehandle,"$anio-$mes-$dia-$nombre_archivos[$ind]");
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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: UPLOADFILE 0 bytes

Notapor seafree » 2018-07-13 09:19 @430

Gracias, explorer, le hacían falta las comillas. Sucede que anteriormente funcionaba sin comillas.

Pero les puse las comillas y se ejecutó correctamente.

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

Re: UPLOADFILE 0 bytes

Notapor explorer » 2018-07-13 16:50 @743

Sí, eso ya te lo comenté, pero, ¿no te das cuenta también de que estás copiando el archivo dos veces?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: UPLOADFILE 0 bytes

Notapor seafree » 2020-02-24 13:42 @612

explorer escribiste:Sí, eso ya te lo comenté, pero, ¿no te das cuenta también de que estás copiando el archivo dos veces?


No me di cuenta de tu comentario, una gran disculpa, el error es en el uso de:

copy $upload_filehandle, $anio-$mes-$dia-$nombre_archivos[$ind];
open my $OUTFILE, '>', $name_file;
print $OUTFILE $buffer;

¿Lo estoy copiando dos veces con el empleo de las funciones copy y print?

Por favor agradeceré tu respuesta.

Saludos y Respetos.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: UPLOADFILE 0 bytes

Notapor explorer » 2020-02-24 16:04 @711

Sí, te lo explico en este mensaje: uploadfile-0-bytes-t9623.html#p40815
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: UPLOADFILE 0 bytes

Notapor seafree » 2020-02-26 12:52 @578

Corregido. Gracias, explorer.

Respetos para ti.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: UPLOADFILE 0 bytes

Notapor seafree » 2020-03-11 13:29 @604

Buenas tardes, explorer. Una vez más problemas con la grabación de archivos, hago todo de acuerdo a lo recomendado anteriormente y no logro guardar los archivos, cuando se ejecuta la instrucción copy envía mensaje de que no cuenta con lo permisos requeridos para hacer el copy.

Los permisos de los directorios son los siguientes:

DIRECTORIO: /var/www/html
Permisos:
755 root.root html/
755 apache.apache public_html/
775 apache.apache Bitacora/
775 apache.apache DIR1/
775 apache.apache DIR2/

La instrucción: mkdir $upload_dir, 0775; se ejecuta PERO crea los DIR con permisos 755, y al ejecutar:

copy($upload_filehandle,"$anio-$mes-$dia-$nombre_archivos[$ind]") or die $!;

Envía el error:

Software error:
Permission denied at /var/www/cgi-bin/Bitacora/save_bitacora.plx line 224.


Y la línea 224 es: copy($upload_filehandle,"$anio-$mes-$dia-$nombre_archivos[$ind]") or die $!

Agradeceré tu valioso apoyo, porque no encuentro el error.

Enormes gracias y respetos para ti.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: UPLOADFILE 0 bytes

Notapor explorer » 2020-03-11 15:09 @673

No importa que los directorios se creen con permisos 755: su usuario es el usuario web, así que sigue teniendo permisos para escribir dentro de ellos. El porqué no se crea con los permisos 0775 como le estás indicando es que antes de aplicar los permisos, la máscara se filtra con el valor indicado por el umask asignado al usuario. Más información en perldoc -f mkdir

Nos falta información sobre qué pasa. Una opción es pedirle más información a Perl. Coloca estas líneas al principio del programa:

use diagnostics;
use CGI::Carp qw(fatalsToBrowser);

Lo que intenta hacer la función copy() que has escrito es copiar del archivo abierto con el manejador $upload_filehandle al archivo con nombre formado a partir de la fecha. Pero lo va a crear en el directorio de trabajo actual, no en ninguna subcarpeta. Quizás el problema sea ese.

¿No será así?

copy($upload_filehandle,"$upload_dir/$anio-$mes-$dia-$nombre_archivos[$ind]") or die $!;

Recuerda que es ideal que $upload_dir contenga una ruta absoluta (completa), salvo que estemos seguros de que estamos (directorio de trabajo actual) trabajando en el sitio correcto. Yo lo que hacía era un chdir() al principio para colocarme en el raíz del directorio donde voy a trabajar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: UPLOADFILE 0 bytes

Notapor seafree » 2020-03-12 12:03 @544

Enormes gracias por tu apoyo, explorer.

Respetos para ti.
seafree
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518


Volver a Intermedio

¿Quién está conectado?

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