Foros del Web » Programando para Internet » Javascript » Frameworks JS »

CGI/perl para subir archivo des de AJAX

Estas en el tema de CGI/perl para subir archivo des de AJAX en el foro de Frameworks JS en Foros del Web. Hola a todos, Tengo un problema utilizando el metodo upload de CGI cuando la informacion es enviada des de un script en ajax (lado cliente). ...
  #1 (permalink)  
Antiguo 04/02/2009, 15:23
 
Fecha de Ingreso: enero-2007
Mensajes: 22
Antigüedad: 17 años, 10 meses
Puntos: 0
CGI/perl para subir archivo des de AJAX

Hola a todos,
Tengo un problema utilizando el metodo upload de CGI cuando la informacion es enviada des de un script en ajax (lado cliente). (el codigo esta mas abajo).
No puedo obtener el filehandle para leer el archivo subido y luego escribirlo en el servidor.
El mensaje de error en perl (servidor):
Cita:
Use of uninitialized value in <HANDLE>
No tengo ningun problema pasando los parametros des del ajax ni tampoco creando la carpeta o archivo (vacio). Entonces los permisos parecen estar correctos.

Tambien he probado de anadir contentType en ajax:
Código:
contentType: "multipart/form-data",
Pero no llego al CGI y obtengo el siguiente error en el servidor:
Cita:
Malformed multipart POST: data truncated
Alguna idea como solucionar este problema?
Alguien tiene algun ejemplo sencillo de como usar perl para subir archivos des d'una web en ajax?


html form



Código HTML:
<link rel="stylesheet" href="jquery.jgrowl.css" type="text/css"/>

<!-- jQuery Library -->
<script type="text/javascript" language="javascript" src="jquery-1.2.6.js"></script>
<script type="text/javascript" language="javascript" src="jquery.jgrowl.js"></script>

<script type="text/javascript" language="javascript" src="test_ajax.js"></script>

<input type=file id=test>

<div id=output></div> 
AJAX

Código:
$(document).ready(function () {
    $("#test").change(function(){
      alert($(this).val());
      var info = $.trim($(this).val());
        $.ajax({
          type: "POST",
          url: "/cgi-bin/upload_and_check.cgi",
          data: "filename="+info+"&session_id=abc",
          success: function(msg){             		 
            alert("This is the message: " + msg);
            $("#output").html(msg);
            $.jGrowl(msg, { sticky: true });
          }
       });
    }); 	
});

CGI/perl


Código:
#!/usr/bin/perl

use warnings;
use strict;
use CGI;

my $form = new CGI;
print $form->header; #Print HTML header

my $web_home = "$ENV{DOCUMENT_ROOT}/ajax";

#Getting parametres from form
my $session_id = $form->param("session_id"); 
my $filename = $form->param("filename");

#Create temp dir if doesn't exist yet
umask 0000;  
if ( !-e "$web_home/tmp/$session_id" ) {
    mkdir "$web_home/tmp/$session_id", 0777 
         or die "Problems creating temporary dir '$web_home/tmp/$session_id':  $!\n";
}

#the upload() method to grab the file handle
my $UPLOAD_FH = $form->upload("filename");

my $newfilename = $session_id;

open my $NEWFILE_FH, "+>", "$web_home/tmp/$session_id/$newfilename.txt" 
    or die "Problems creating file '$newfilename': $!";
 
while ( <$UPLOAD_FH> ) {
	print $NEWFILE_FH;
}

close $NEWFILE_FH or die "I cannot close filehandle: $!";

exit;
  #2 (permalink)  
Antiguo 04/02/2009, 19:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: CGI/perl para subir archivo des de AJAX

Hola flope,

Lamentablemente no se pueden enviar archivos con AJAX, solamente variables de texto planas.

Saludos
  #3 (permalink)  
Antiguo 05/02/2009, 07:41
 
Fecha de Ingreso: enero-2007
Mensajes: 22
Antigüedad: 17 años, 10 meses
Puntos: 0
Respuesta: CGI/perl para subir archivo des de AJAX

Hola,
Si, lo se.
La subida del archivo la hace CGI/perl en el lado del servidor.
Existen bastantes ejemplos en internet de uploads (con o sin barra de progreso, uno o multiples archivos) con ajax en el lado del cliente y PHP en el lado del servidor.
Lo que intento es canviar el PHP por CGI/perl pero no he encantrado ningun ejemplo,
Gracias!
  #4 (permalink)  
Antiguo 05/02/2009, 10:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: CGI/perl para subir archivo des de AJAX

No, lo que se hace es "simular" en AJAX, lo que haces es enviar a un iframe oculto y con AJAX hacer el polling del status, AJAX no puede enviar files, y es lo que tu estas tratando de hacer, busca en Google "hidden iframe upload" y vas a ver muchos scripts al respecto.

Saludos
  #5 (permalink)  
Antiguo 05/02/2009, 16:40
 
Fecha de Ingreso: enero-2007
Mensajes: 22
Antigüedad: 17 años, 10 meses
Puntos: 0
Respuesta: CGI/perl para subir archivo des de AJAX

Si al final he entendido mejor como funciona y encontre una solucions.
Aqui les dejo un ejemplo muy sencillo de como utilitzar ajax and cgi/perl para subir un archivo.
No hay recargas de la web ni boton de envio.
Espero q tambien pueda servir de ejemplo para otros.

Gracias por vuestra ayuda

HTML
Código:
<!--jquery should be included before any other js-->
<script type="text/javascript" language="javascript" src="/simple_ajax_cgi_example/jquery-1.2.6.js"></script>
<script type="text/javascript" language="javascript" src="/simple_ajax_cgi_example/simple_ajax_cgi_example.js"></script>

<html>
<body>
<form action="/cgi-bin/simple_ajax_cgi_example.cgi" id="form1" name="form1" encType="multipart/form-data"  method="post" target="hidden_frame" >
<input type="file" id="file" name="file" style="width:450">
<!--<INPUT type="submit"  id="test" value="submit">-->
<span id="msg"></span>
<br>
       
<iframe name='hidden_frame' id="hidden_frame" style='display:none'></iframe>
</form>

</body>
</html>
AJAX simple_ajax_cgi_example.js
Código:
$(document).ready(function () {
    $("#file").change(function() {
        $("#form1").submit();
    });
});

function callback(msg) {
    $("#msg").html(msg);
}
CGI/Perl simple_ajax_cgi_example.js
Código:
#!/usr/bin/perl

use warnings;
use strict;
use CGI;

my $form = new CGI;

print $form->header; #Print HTML header. this is mandatory

my $web_home = "$ENV{DOCUMENT_ROOT}/simple_ajax_cgi_example";

my $UPLOAD_FH = $form->upload("file");

my $newfilename = "new_file";

umask 0000; #This is needed to ensure permission in new file

open my $NEWFILE_FH, "+>", "$web_home/tmp/$newfilename.txt" 
    or die "Problems creating file '$newfilename': $!";

while ( <$UPLOAD_FH> ) {
    print $NEWFILE_FH "$_";
}

close $NEWFILE_FH or die "I cannot close filehandle: $!";

##this is the only way to send msg back to the client
print "<script>parent.callback('upload file success')</script>";

exit;
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:59.