PDA

Bekijk Volledige Versie : [perl] upload met CGI.pm , bijna goed..



henq
06/11/04, 13:05
...maar nog niet helemaal :-)

ik gebruik dit stukje:


my $filename = $cgiobj->param('f_upload');

if ($filename) {

my $fp = $filename;
$fp =~ s/[ \.\':\\]/_/g;

my $localf = "/private/tmp/$fp";
open UPLD, ">$localf" or die $!;

my $buffer;
my $read;
while ($read = read($filename, $buffer, 1024)) {
print UPLD $buffer;
}

close UPLD;
}

Ik heb me gek geGoogled, maar bovenstaande zou moeten werken.

De file wordt gemaakt na de form POST, maar de file blijft 0 bytes groot.
Iemand een idee ?

(OSX, dus geen binmode nodig; ook (<filename>) variant geprobeerd; een
subtiel rechten probleem?)

bvhd!

henk

henq
06/11/04, 15:05
ikzelf schreef in bericht news:418cbcef$1$78749$e4fe514c@news.xs4all.nl...
> ..maar nog niet helemaal :-)
>
> ik gebruik dit stukje:
>
>
> my $filename = $cgiobj->param('f_upload');
>
> ....

Gevonden. De nieuwe versie van CGI.pm werkt een stukje simpeler, met
upload():

my $filename = $cgiobj->param('f_upload');

if ($filename) {

my $fp = $filename;
$fp =~ s/[ \.\':\\]/_/g;

my $localf = "/private/tmp/$fp";
open UPLD, ">>$localf" or die $!;

my $F = $cgiobj->upload('f_upload'); <<<<
while (<$F>) {
print UPLD;
}

close UPLD;
}

John Bokma
06/11/04, 20:55
"henq" <henq _ replace 0 by o wrote:

> ..maar nog niet helemaal :-)

Gebruik CGI.pm

> ik gebruik dit stukje:
>
>
> my $filename = $cgiobj->param('f_upload');
>
> if ($filename) {
>
> my $fp = $filename;
> $fp =~ s/[ \.\':\\]/_/g;

Tip: fix geen dingen, maar check of het valt in de namen die je
toestaat. En dan kan je evt. nog dingen vervangen.

> my $localf = "/private/tmp/$fp";

Het bestand kan nu overschreven worden door anderen, die dezelfde naam
geven.

> open UPLD, ">$localf" or die $!;
>
> my $buffer;
> my $read;
> while ($read = read($filename, $buffer, 1024)) {

read $filename?? Lees de CGI specs door, aangezien je het zelf wilt
doen, of beter, gebruik CGI.pm

> print UPLD $buffer;
> }
>
> close UPLD;
> }
>
> Ik heb me gek geGoogled, maar bovenstaande zou moeten werken.
>
> De file wordt gemaakt na de form POST, maar de file blijft 0 bytes
> groot. Iemand een idee ?
>
> (OSX, dus geen binmode nodig; ook (<filename>) variant geprobeerd; een
> subtiel rechten probleem?)

Nee, want dat die't de open. Je kan ook de print en close nog testen,

print UPLD $buffer or die "Can't write: $!";

close UPLD or die "Can't close: $!";

overigens, in een recente perl versie kan je autovivicatie gebruiken,
dus:

open my $upld, "$localf" or die "Can't open '$localf': $!";
:
:
print $upld $buffer or die "Can't write to '$localf': $!";

etc.

Merk op dat ik iets meer zinnigs in de die statements zet.

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

henq
06/11/04, 22:15
"John Bokma" <postmaster@castleamber.com> schreef in bericht
news:Xns95998CAF3C708castleamber@130.133.1.4...
> "henq" <henq _ replace 0 by o wrote:
>
>> ..maar nog niet helemaal :-)
>
> Gebruik CGI.pm

Zoals in het onderwerp vermeld, ik gebruik juist CGI.pm. $cgiobj is een
instantie van CGI;
Maar dan nog steeds moet je zelf enkele regels perl toevoegen. Ik probeer
braaf de voorbeelden uit de handleiding toe te passen.

>
>> ik gebruik dit stukje:
>>
>> open UPLD, ">$localf" or die $!;
>>
>> my $buffer;
>> my $read;
>> while ($read = read($filename, $buffer, 1024)) {
>
> read $filename?? Lees de CGI specs door, aangezien je het zelf wilt
> doen, of beter, gebruik CGI.pm

Ja, read $filename want $filename heeft een dubbelrol in CGI.pm, zoals
iedereen weet. Knip-plak uit perldoc CGI.pm van mijn installatie:

$filename = $query->param('uploaded_file');

The filename returned is *also* a file handle. You can read the
contents
of the file using standard Perl file reading calls:

# Read a text file and print it out
while (<$filename>) {
print;
}

# Copy a binary file to somewhere safe
open (OUTFILE,">>/usr/local/web/users/feedback");
while ($bytesread=read($filename,$buffer,1024)) {
print OUTFILE $buffer;
}



~henk

John Bokma
07/11/04, 05:55
"henq" <henq _ replace 0 by o wrote:

>
> "John Bokma" <postmaster@castleamber.com> schreef in bericht
> news:Xns95998CAF3C708castleamber@130.133.1.4...
>> "henq" <henq _ replace 0 by o wrote:
>>
>>> ..maar nog niet helemaal :-)
>>
>> Gebruik CGI.pm
>
> Zoals in het onderwerp vermeld, ik gebruik juist CGI.pm. $cgiobj is
> een instantie van CGI;
> Maar dan nog steeds moet je zelf enkele regels perl toevoegen. Ik
> probeer braaf de voorbeelden uit de handleiding toe te passen.

Maar minder dan je gebruikte :-)

> The filename returned is *also* a file handle. You can read the
> contents
> of the file using standard Perl file reading calls:

Aaahhh... ok :-)

"or undef if the parameter is not a valid filehandle"

Zou ik wel op controleren (weet niet of je dat deed)

> # Copy a binary file to somewhere safe
> open (OUTFILE,">>/usr/local/web/users/feedback");

Brrr, en dat voorbeeld komt uit de CGI.pm documentatie? (Eh, ja dus)

> while ($bytesread=read($filename,$buffer,1024)) {
> print OUTFILE $buffer;

En check ff bytesread, of de som overeenkomt met de opgegeven
bestandsgrootte / verwachtte bestandsgrootte.

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html