Bekijk Volledige Versie : [perl] upload met CGI.pm , bijna goed..
...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
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
"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