• Publicidad

CGI con Perl. Problema: Premature end of script headers

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

CGI con Perl. Problema: Premature end of script headers

Notapor AngelHernandez » 2012-12-14 18:16 @803

Hola, pues tengo un problema al ejecutar desde mi servidor Apache un script en Windows. El código es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin/perl.exe
  2. use Win32::OLE;
  3.  
  4. if ($ENV{'REQUEST_METHOD'} eq 'POST') {
  5.  
  6.     read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  7.  
  8.     @pairs = split(/&/, $buffer);
  9.  
  10.     foreach $pair (@pairs) {
  11.        ($name, $value) = split(/=/, $pair);
  12.        $value =~ tr/+/ /;
  13.        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  14.  
  15.     $FORM{$name} = $value;
  16.     }
  17.    
  18.     eval {$ex = Win32::OLE->GetActiveObject('Excel.Application')};
  19.     die "Excel not installed" if $@;
  20.     unless (defined $ex) {
  21.                 $ex = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
  22.                 or die "Oops, cannot start Excel";
  23.         }
  24.        
  25.         $writeBook = $ex->Workbooks->Open("C:\\Program Files\\Apache Group\\Apache2\\htdocs\\Excel\\credencialMacro.xls");
  26.     $readBook = $ex->Workbooks->Open("C:\\Program Files\\Apache Group\\Apache2\\htdocs\\Excel\\Book2.xls");
  27.  
  28.     $writeSheet = $writeBook->Worksheets("BD");
  29.     $writeSheet->Activate();
  30.        
  31.     $readSheet = $readBook->Worksheets("Sheet2");
  32.     $readSheet->Activate();
  33.        
  34.     my $Tot_Rows = $readSheet->UsedRange->Rows->{'Count'};
  35.        
  36.     my $rows = 1;      
  37.     while($rows <= $Tot_Rows){
  38.                 $writeSheet->Cells($rows,2)->{Value} = $readSheet -> Cells($rows,1) -> {Value};
  39.                 $rows++;
  40.         }
  41.            
  42.     $ex->{DisplayAlerts} = 0; # alerts Off
  43.     $writeBook->{CheckCompatibility} = "False";
  44.  
  45.     $ex->Run('credencialMacro.xls!creaCredencial');
  46.        
  47.         undef $readBook;
  48.     $writeBook->SaveAs( 'C:\\Program Files\\Apache Group\\Apache2\\htdocs\\Excel\\Descargas\\credencialMacro.xls' );
  49.     undef $writeBook;
  50.     undef $ex;
  51. }
  52.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Este código lee dos excel y copia el contenido de uno a otro. Pero me manda el error: Premature end of script headers.

¡¡¡ Auxilio !!!
AngelHernandez
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-12-11 13:51 @619

Publicidad

Re: CGI con Perl. Problema Premature end of script headers

Notapor explorer » 2012-12-14 18:21 @806

¿Este programa lo tienes que ejecutar como CGI?

Parece que no...

EDITO: Si lo ejecutas desde la línea de comandos, ¿qué sale en pantalla?

VUELVO A EDITAR: No sé si he hecho la pregunta correcta, así que la haré de otra manera: ¿es necesario que para ejecutar este programa lo hagas usando el Apache y un navegador web? ¿Este programa va a ser ejecutado por parte de un usuario usando el protocolo HTTP? El error que sale es precisamente porque este programa no entrega las cabeceras HTTP que el servidor espera. Y por eso hice la primera pregunta: ¿seguro que este programa no es un programa normal para ser ejecutado desde la línea de comandos? Si es así, sobran todas las líneas que hacen referencia al protocolo CGI.
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: CGI con Perl. Problema: Premature end of script headers

Notapor AngelHernandez » 2012-12-14 19:00 @833

Este código fue hecho en primera instancia para ser ejecutado en línea de comandos, ahí todo funciona como es esperado.

Ahora queremos montarlo en un cgi para que sea llamado dentro de un <form> de un archivo html. Las primeras líneas, en efecto, por el momento no hacen nada, son para asignar los valores que me mandó el <form> a través del POST.
AngelHernandez
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-12-11 13:51 @619

Re: CGI con Perl. Problema: Premature end of script headers

Notapor explorer » 2012-12-15 07:44 @363

Bueno, pues entonces, unas consideraciones...

  • no hace falta que escribas '\\' en cada ocasión. En Windows también se puede usar la barra '/' para crear las rutas:
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using perl Syntax Highlighting
    1.     $readBook = $ex->Workbooks->Open('C:/Program Files/Apache Group/Apache2/htdocs/Excel/Book2.xls');
    Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
  • estás escribiendo muchas líneas para convertir tu programa en un cgi. Desde hace muchos años, las distribuciones de Perl vienen con el módulo CGI que permite ahorrarte mucho código: en tu programa, las líneas 6 a 16 las hace de forma automática. Mira mi CGI mínimo
  • para que sea un cgi de verdad, tu programa debe enviar una cabecera HTTP y luego una respuesta HTML, que el servidor web enviará directamente al navegador del usuario.

    La operativa del programa está clara: manipular un par de archivos en formato Excel. Lo que no sabemos es qué tiene que salir en la pantalla del usuario. ¿Quizás un mensaje diciendo que el proceso ha terminado bien?

Sería algo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:/perl/bin/perl.exe
  2. use CGI       qw(:standard      );
  3. use CGI::Carp qw(fatalsToBrowser);       # solo para depurado
  4. use Win32::OLE;
  5.  
  6. print header;                              # mandamos la cabecera HTTP
  7. print start_html('Copiado de las hojas');  # inicio de la página HTML
  8.  
  9. ## Proceso
  10. my $ex;
  11. eval {                                   # ver si existe el objeto Excel en el sistema
  12.     $ex = Win32::OLE->GetActiveObject('Excel.Application');
  13. };
  14. die "Excel not installed" if $@;         # no, no está
  15.  
  16. unless (defined $ex) {
  17.     $ex = Win32::OLE->new(               # intentamos arrancarlo
  18.             'Excel.Application', sub {$_[0]->Quit;}
  19.         ) or die "Oops, cannot start Excel";
  20. }
  21.  
  22. my $path = 'C:/Program Files/Apache Group/Apache2/htdocs/Excel';
  23.  
  24. my $writeBook = $ex->Workbooks->Open("$path/credencialMacro.xls");
  25.  
  26. my $readBook  = $ex->Workbooks->Open("$path/Book2.xls");
  27.  
  28. my $writeSheet = $writeBook->Worksheets("BD");
  29. $writeSheet->Activate();
  30.        
  31. my $readSheet  = $readBook->Worksheets("Sheet2");
  32. $readSheet->Activate();
  33.        
  34. my $Tot_Rows = $readSheet->UsedRange->Rows->{'Count'};
  35.        
  36. my $rows = 1;      
  37. while ($rows <= $Tot_Rows){
  38.     $writeSheet->Cells($rows,2)->{Value} = $readSheet -> Cells($rows,1) -> {Value};
  39.     $rows++;
  40. }
  41.            
  42. $ex->{DisplayAlerts} = 0;             # alerts Off
  43. $writeBook->{CheckCompatibility} = "False";
  44.  
  45. $ex->Run('credencialMacro.xls!creaCredencial');
  46.        
  47. $writeBook->SaveAs("$path/Descargas/credencialMacro.xls");
  48.  
  49. undef $readBook;
  50. undef $writeBook;
  51. undef $ex;
  52.  
  53. ## Salimos
  54. print p('Tarea terminada');           # informamos
  55. print p("$rows filas copiadas");
  56.  
  57. print end_html;                       # fin del HTML
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

P.D.: por motivos de eficiencia, el Excel no debería ser cerrado (Quit), sino estar permanentemente funcionando. Así, la respuesta es mucho más rápida, ya que el sistema operativo no tiene que arrancarlo.

P.P.D.: a la larga, os daréis cuenta de que esto no funcionará de manera confiable (cosas del OLE y Windows... yo ya lo he sufrido... ¿Realmente Windows es un sistema operativo confiable :?: )
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: CGI con Perl. Problema: Premature end of script headers

Notapor AngelHernandez » 2012-12-16 13:23 @599

Nombre, muchas gracias por tu respuesta, ¡todo ha ido bien!
¡Saludos!
AngelHernandez
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-12-11 13:51 @619


Volver a Intermedio

¿Quién está conectado?

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