PDA

Visualizza la versione completa : [ Perl ] uplodare un file


C232
28-01-2005, 20:47
ragazzi ma come è possibile uplodare file da Perl?

LordSaga640
28-01-2005, 23:30
Cioè?
Un modulo HTML che invia un file ad un CGI in perl?
<input type=file name=MioFile> del tipo?

Claudio Vituzzi
29-01-2005, 02:53
Allora,

se stavi chiedendo come fare l'upload di un file, da una pagina HTML con form, al server usando Perl,

dai un occhiata a questo codice:



#!/usr/bin/perl
#
# upload.cgi

use strict;
use warnings;
use CGI::Carp "fatalsToBrowser";
use CGI;

my $q = new CGI();

my $file = $q->param('UPLOAD') || die "You didn't select a file!!\n$!";
my ($name) = ($file =~ m|([^\\/]+)$|);

my $upload_path = '/upload/' . $name;

open(LOCAL,">$upload_path") || die "Error: $upload_path\n$!";
binmode(LOCAL);
while(<$file>) {
print LOCAL $_;
}
close(LOCAL);

chmod (0644,"$upload_path");

print "Content-type: text/html\n\n";
print "Upload del file: $name eseguito con successo!\n";


naturalmente questa sarà la pagina html che richiamerà lo script:



...
<body>
<h2>Upload files:</h2>
<form ENCTYPE="multipart/form-data" ACTION="upload.cgi" METHOD="POST">
Please select a file to upload:

<input type="file" NAME="UPLOAD">
<input type="submit" value=" submit file ">
</form>
</body>
...


altrimenti se stavi chiedendo come fare per fare l'upload di un file da Perl (client) verso uno script che riceve l'upload (server) (magari uno script Perl!?), beh, è un pochino più difficile.

devi prima di tutto ricostruire una richiesta POST col protocollo HTTP, poi usare un modo per comunicare con il server ricevente, i Socket.

Questo è un codice abbozzato, vedi un pò se funziona (eseguilo dal prompt/shell)



#!/perl

use strict;
use warnings;
use Socket qw(:DEFAULT :crlf);
use IO::Socket::INET;

my $content;
my $file = "file.zip"; # Il tuo file da *uploaudare*
my $size = (-s $file);
my $target = 'http://www.yoursite.it/cgi-bin/upload.cgi'

my $socket = IO::Socket::INET->new(
PeerAddr => 'http://www.yoursite.it/',
PeerPort => '80',
Proto => 'tcp',
Type => SOCK_STREAM ) or die "Couldn't connect! $!\n";


syswrite $socket, "POST $target HTTP/1.0".$CRLF;
syswrite $socket, "Accept: */*".$CRLF;
syswrite $socket, "Accept-Language: en".$CRLF;
syswrite $socket, "Connection: Keep-Alive".$CRLF;
syswrite $socket, "User-Agent: Mozilla/4.0".$CRLF;
# syswrite $socket, "Content-type: application/octet-stream".$CRLF;
syswrite $socket, "Content-length: $size".$CRLF;
syswrite $socket, "$CRLF";

open(READ, "<$file") || die "$!\n";
binmode(READ);
while( read(READ,$content,4096) )
{ syswrite $socket, $content; }
close(READ);

print <$socket>;
close $socket;


Ciao!

C232
29-01-2005, 16:20
Grazie!

lostiamoxdendo
31-12-2005, 16:51
#!/perl

use strict;
use warnings;
use Socket qw(:DEFAULT :crlf);
use IO::Socket::INET;

my $content;
my $file = "file.zip"; # Il tuo file da *uploaudare*
my $size = (-s $file);
my $target = 'http://www.yoursite.it/cgi-bin/upload.cgi'

my $socket = IO::Socket::INET->new(
PeerAddr => 'http://www.yoursite.it/',
PeerPort => '80',
Proto => 'tcp',
Type => SOCK_STREAM ) or die "Couldn't connect! $!\n";


syswrite $socket, "POST $target HTTP/1.0".$CRLF;
syswrite $socket, "Accept: */*".$CRLF;
syswrite $socket, "Accept-Language: en".$CRLF;
syswrite $socket, "Connection: Keep-Alive".$CRLF;
syswrite $socket, "User-Agent: Mozilla/4.0".$CRLF;
# syswrite $socket, "Content-type: application/octet-stream".$CRLF;
syswrite $socket, "Content-length: $size".$CRLF;
syswrite $socket, "$CRLF";

open(READ, "<$file") || die "$!\n";
binmode(READ);
while( read(READ,$content,4096) )
{ syswrite $socket, $content; }
close(READ);

print <$socket>;
close $socket;


Ragazzi potete aiutarmi a far funzionare questo codice? La risposta del server è ke il file non è stato caricato dal form..

Loading