• Publicidad

Can't use an undefined value as a HASH reference at

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Can't use an undefined value as a HASH reference at

Notapor danimera » 2013-03-26 09:16 @428

Tengo este error cuando quiero hacer el upload de un fichero...

Can't use an undefined value as a HASH reference at libs/CGI/UploadEasy.pm line 208.

pero solamente me sale cuando lo llamo dentro de un método de cgi-app, básicamente si uso un fichero sencillo de Perl para hacer el upload no tengo problema pero más o menos mi forma de hacer el llamado es así.

Tengo un MyBase.pm con el método
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub uploadFile {
  2.     my $self = shift;
  3.     my $path = shift;
  4.     eval { mkdir $self->cfg('upload_dir') . "/$path"; };
  5.     my $ue    = CGI::UploadEasy->new( -uploaddir => $self->cfg('upload_dir') . "/$path" );
  6.     my $info  = $ue->fileinfo;         #obtiene las imágenes subidas
  7.     my @names = keys %$info;
  8.     return @names;
  9. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Tengo un fichero user.pm que usa como base el MyBase.pm y el método que llama el action del form es
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub user_upload_profile_image {
  2.     my $self = shift;
  3.     my $dbh  = $self->dbh;
  4.  
  5.     my $system = MyApp::Db::System->new($dbh);
  6.     my $user   = MyApp::Db::Usuario->new($dbh);
  7.     my $image  = MyApp::Db::Imagen->new($dbh);
  8.  
  9.     my $username = $self->authen->username;
  10.     $username = $self->session->param('username') if !$username;
  11.  
  12.     my $profileImage = $self->uploadFile( $self->fecha_actual );    #aquí se daña la cosa
  13. }
  14.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


lo más curioso del caso es que estos métodos los uso desde hace varios meses ya para varios sitios que tengo y el upload me funciona bien, y no entiendo por qué ahora tengo ese error...

El módulo en CPAN dice algo como:

No CGI object may be created before the CGI::UploadEasy object has been created, or else the upload will fail. Likewise, if you import method names from CGI.pm, be careful not to call any CGI functions before the creation of the CGI::UploadEasy object.


Eso es todo... llevo ya muchas horas con este error.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Re: Can't use an undefined value as a HASH reference at

Notapor explorer » 2013-03-26 18:22 @807

Según la advertencia que da el módulo, no se puede crear un objeto CGI *antes* de haber creado el objeto CGI::UploadEasy, ya que éste se debe encargar de bajar todos los archivos que manda el usuario, cuanto antes. O en caso de importar métodos desde CGI, no llamar a ninguna función CGI antes de la creación del objeto CGI::UploadEasy.

Veo que en la línea 10 estás llamando a session() y a param().

Entonces, en el programa, puedes hacer el use de los módulos, pero primero debes crear el objeto CGI::UploadEasy, y *luego*, -lo ideal, pero no necesario-, usas el objeto CGI que él ha usado (con el método cgiobject()).

Bueno, esto es lo que creo que pasa... viendo el código del módulo, la línea que se queja es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         my ($cntrname) = $cgi->uploadInfo($TEMP)->{'Content-Disposition'} =~ /\bname="([^"]+)"/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El error está en que en ese momento, $cgi->uploadInfo($TEMP) no está definido, o dicho de otra manera: el archivo $TEMP no entrega ninguna información de upload. Quizás porque $TEMP no apunta a un archivo subido (por ser un parámetro cualquiera del propio formulario, sin relación con la caja de Upload del formulario).

Es la línea 192 la que me mosquea: recorre todos los parámetros que nos pasa el formulario, pero sin filtrar si son realmente parámetros de archivos subidos, o cualquier otro tipo de parámetros, como los que entrega el método otherparam().
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     for my $TEMP ( map $cgi->upload($_), $cgi->param ) {
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: Can't use an undefined value as a HASH reference at

Notapor danimera » 2013-03-26 19:06 @837

Honestamente... esta forma de código la uso en otros sitios y no tengo ese problema...
aunque he quitado las líneas y he puesto el my $profileImage = $self->uploadFile2($self->fecha_actual); antes de cualquier otra cosa el error persiste...

la única diferencia que tengo es que en mis otros sitios el formulario lo genera el módulo CGI-Formbuilder...
pero ya hice otra prueba con formbuilder y tuve el mismo error.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Can't use an undefined value as a HASH reference at

Notapor explorer » 2013-03-26 20:53 @912

Pues algo ha cambiado. ¿No será que están activados los warnings o el modo estricto? ¿No será que el FormBuilder genera algún campo de formulario más aparte del upload?
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: Can't use an undefined value as a HASH reference at

Notapor danimera » 2013-03-27 08:04 @378

Pues no lo creo, afuera del cgi-application todo funciona normal, miraré por los lados del cgiapp_init y de algún otro módulo o algo que haya activado... para que ojalá a nadie le pase este error... van 3 días, y nada.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Can't use an undefined value as a HASH reference at

Notapor explorer » 2013-03-27 08:25 @392

Es que, en un entorno de CGI::Application, ¿cómo puedes estar seguro de que no se hace ninguna llamada a CGI antes de que lo haga CGI::EasyUpload?

¿El FormBuilder crea un formulario cuyo method es 'multipart/form-data'?
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: Can't use an undefined value as a HASH reference at

Notapor danimera » 2013-03-27 09:00 @416

Sobre el entorno CGI::Application yo ya tengo sitios usando el cgi-UploadEasy y no han presentado problemas, Yo no sé qué hace el CGI-Application internamente así que no estoy seguro de que llame al CGI antes...

MyBase.pm usa como base CGI::Application
User.pm usa como base a MyBase.pm
MyBase.pm tiene el método upload, el cual es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub uploadFile{
  2.     my $self = shift;
  3.     my $path = shift;
  4.  
  5.     eval {
  6.     mkdir $self->cfg('upload_dir')."/$path";
  7.     };
  8.  
  9.     my $ue =  CGI::UploadEasy->new( -uploaddir => $self->cfg('upload_dir')."/$path");
  10.     my $info = $ue->fileinfo; #obtiene las imagines subidas
  11.     my @names = keys %$info;
  12.     return  @names;
  13. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Creo que me tocará bajar un MyBase.pm de los otros sitios que funcionan e ir depurando paso por paso a ver qué pudo suceder...

El formbuilder sí tiene el method multipart/form-data.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Can't use an undefined value as a HASH reference at

Notapor danimera » 2013-04-25 07:42 @363

Reactivo este foro, por que quizás a alguien le pueda pasar... Bueno, no encuentro la solución pero pongo dos cosas para ver si alguien puede detectar qué pasa...

Hago un die Dumper $q; para ver qué obtiene, obviamente, mi $q = CGI->new;

Hago este dumper de tres formas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # dumper de $q en user.pl
  2. $VAR1 = bless( {
  3.                  '.parameters' => [
  4.                                     '_submitted_form_category',
  5.                                     'mode',
  6.                                     'imagen_filetfftyr',
  7.                                     '_submit'
  8.                                   ],
  9.                  '.tmpfiles' => {
  10.                                   '*Fh::fh0000112345.jpg' => {
  11.                                                                'info' => {
  12.                                                                            'Content-Type' => 'image/jpeg',
  13.                                                                            'Content-Disposition' => 'form-data; name="imagen_filetfftyr"; filename="12345.jpg"'
  14.                                                                          },
  15.                                                                'name' => bless( do{\(my $o = '/usr/tmp/CGItemp1270')}, 'CGITempFile' ),
  16.                                                                'hndl' => bless( \*{'Fh::fh0000112345.jpg'}, 'Fh' )
  17.                                                              }
  18.                                 },
  19.                  'mode' => [
  20.                              'editProfileImage'
  21.                            ],
  22.                  '.charset' => 'ISO-8859-1',
  23.                  'imagen_filetfftyr' => [
  24.                                           $VAR1->{'.tmpfiles'}{'*Fh::fh0000112345.jpg'}{'hndl'}
  25.                                         ],
  26.                  '_submit' => [
  27.                                 'Submit'
  28.                               ],
  29.                  '.fieldnames' => {},
  30.                  'escape' => 1,
  31.                  '_submitted_form_category' => [
  32.                                                  '1'
  33.                                                ]
  34.                }, 'CGI' );
  35.  
  36. #dumper del $q dentro del módulo uploadeasy  haciendo el upload fuera del cgi-app
  37. $VAR1 = bless( {
  38.                  '.parameters' => [
  39.                                     '_submitted_form_category',
  40.                                     'mode',
  41.                                     'imagen_filetfftyr',
  42.                                     '_submit'
  43.                                   ],
  44.                  '.tmpfiles' => {
  45.                                   '*Fh::fh0000112345.jpg' => {
  46.                                                                'info' => {
  47.                                                                            'Content-Type' => 'image/jpeg',
  48.                                                                            'Content-Disposition' => 'form-data; name="imagen_filetfftyr"; filename="12345.jpg"'
  49.                                                                          },
  50.                                                                'name' => bless( do{\(my $o = '/usr/tmp/CGItemp1320')}, 'CGITempFile' ),
  51.                                                                'hndl' => bless( \*{'Fh::fh0000112345.jpg'}, 'Fh' )
  52.                                                              }
  53.                                 },
  54.                  'mode' => [
  55.                              'editProfileImage'
  56.                            ],
  57.                  '.charset' => 'ISO-8859-1',
  58.                  'imagen_filetfftyr' => [
  59.                                           $VAR1->{'.tmpfiles'}{'*Fh::fh0000112345.jpg'}{'hndl'}
  60.                                         ],
  61.                  '_submit' => [
  62.                                 'Submit'
  63.                               ],
  64.                  '.fieldnames' => {},
  65.                  'escape' => 1,
  66.                  '_submitted_form_category' => [
  67.                                                  '1'
  68.                                                ]
  69.                }, 'CGI' );
  70.  
  71. #dumper del $q cgi cuando llamo la función upload en algún módulo cgi-application
  72. $VAR1 = bless( {
  73.                  '.parameters' => [
  74.                                     '_submitted_form_category',
  75.                                     'mode',
  76.                                     'imagen_filetfftyr',
  77.                                     '_submit'
  78.                                   ],
  79.                  '.charset' => 'ISO-8859-1',
  80.                  '_submit' => [
  81.                                 'Submit'
  82.                               ],
  83.                  'imagen_filetfftyr' => [
  84.                                           bless( \*{'Fh::fh0000112345.jpg'}, 'Fh' )
  85.                                         ],
  86.                  'mode' => [
  87.                              'editProfileImage'
  88.                            ],
  89.                  '.fieldnames' => {},
  90.                  '_submitted_form_category' => [
  91.                                                  '1'
  92.                                                ],
  93.                  'escape' => 1
  94.                }, 'CGI' );
  95.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Este último tiene una gran diferencia y posiblemente ahí puede estar el problema. Parece que se perdiera los tmp files :S
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Can't use an undefined value as a HASH reference at

Notapor explorer » 2013-04-25 15:19 @680

No estamos seguros de que estemos viendo los mismos objetos... Recuerda que en C::A, si no se le indica, creará un objeto CGI de forma automática. Y CGI::UploadEasy, lo mismo.

Yo probaría a hacer lo siguiente: en cgiapp_init(), lo primero que haría sería crear un objeto CGI::UploadEasy, y que se encargue de bajar los archivos; luego, recupero el objeto CGI que él ha usado (con $ue->cgiobject()) y se lo paso a C::A (con $self->query()); y más tarde, cuando necesitase un objeto CGI::FormBuilder, le paso mi objeto CGI con la opción 'params', en el new().

De esta manera, garantizo que, al menos entre estos tres sistemas, se comparte el mismo y único objeto CGI, reduciendo las posibilidades de colisió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: Can't use an undefined value as a HASH reference at

Notapor danimera » 2013-04-25 20:51 @911

Definitivamente hice algo parecido y pude darme cuenta que en el init tenía algo que me cambiaba el objeto cgi y no me pasaba los archivos temps que es lo que lee el upload...

$self->tmpl_path("templates/".$self->current_language."/" );

cuando quito esta línea el objeto sigue igual hasta ahí, luego en otra parte me está algo que me elimina del objeto cgi el:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. '.tmpfiles' => {
  2.  
  3.                                   '*Fh::fh0000112345.jpg' => {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Bueno, ya detecté un bug que afecta este módulo. Ahora desde Mybase.pm estoy recibiendo todo bien, eso lo pruebo cuando en mi user.pm en la función setup que usa como base MyBase.pm hago un die del $q de mi objeto CGI...

Pero cuando en cualquier otro método hago el die, ahí ya pierdo el .tmpfiles...

Voy a seguir depurando para ver dónde está la cuestión, pero es eso, si el objeto cgi pierde el .tmpfiles se daña la cosa.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Siguiente

Volver a Avanzado

¿Quién está conectado?

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