/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
script til upload - problem
Fra : Joergen Soerensen


Dato : 26-11-00 13:25

Jeg har puslet lidt med nedenstående script som jeg har fundet på nettet
Scriptet skulle uploade filer til en web-server
det ser jo ret simpelt ud - men det virker bare ikke

############################################################################
####

#!perl

############################################################################
####
# opsætningsparametre - start
############################################################################
####
# 1) Definer placeringen af filer
# Sti hvor filerne skal uploades - ingen / til sidst
$basedir = "D:/Hjemmesider/Content/test";

# Den side der skal vises efter upload f.eks.
http://www.mydomainname.com/thankyou.html
$donepage = "http://192.168.0.1/test/index.htm";

# 2) Definer Hvilke filtyper der må benyttes
# alle eller en filtype(r) ja/nej
$tillad_alle = "ja";

# hvis "nej" ovenfor - hvilke typer tillades (brug 4 tegn f.eks. .ext)
$fil_efternavn = ".gif";

############################################################################
####
# opsætningsparametre - slut
############################################################################
####
# program start
############################################################################
####
use CGI;
$nummer = 1;

while ($nummer != 11) {
my $req = new CGI;
my $file = $req->param("FILE1");
my $file = $req->param("FILE$nummer");
if ($file ne "") {
my $fileName = $file;
$fileName =~ s!^.*(\\|\/)!!;
$newmain = $fileName;
if ($tillad_alle ne "ja") {
if (lc(substr($newmain,length($newmain) - 4,4)) ne $fil_efternavn) {
$filenotgood = "yes";
}
}
if ($filenotgood ne "yes") {
open (OUTFILE, ">$basedir/$fileName");
print "$basedir/$fileName<br>";
while (my $bytesread = read($file, my $buffer, 1024))

print OUTFILE $buffer;
}
close (OUTFILE);
}
}
$nummer++;
}

print "Content-type: text/html\nLocation:$donepage\n\n";

############################################################################
####
# slut på program
############################################################################
####

Jeg får fejlmeldingen (i error.log)
[Sat Nov 25 17:40:05 2000] [error] [client 192.168.0.6] Premature end of
script headers: c:/perl/cgi-bin/psupload.cgi
[Sat Nov 25 17:40:05 2000] [error] [client 192.168.0.6] CGI open of tmpfile:
No such file or directory

Hvis jeg ikke vælger nogen fil kører det OK men det er jo et uinteresant
tilfælde
############################################################################
####

Scriptet kaldes fra en hjemmeside med følgende kode:

<html><body>
<form method="POST" action="/cgi-bin/psupload.cgi"
ENCTYPE="multipart/form-data">
File 1: <input type="file" name="FILE1"><br>
File 2: <input type="file" name="FILE2"><br>
<input type="submit" value="Send fil(er)!!">
</form></body></html>

############################################################################
####

Systemet er: win98 med Apache-server samt
(C:\Perl\cgi-bin>perl -v) giver:
This is perl, v5.6.0 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)
Copyright 1987-2000, Larry Wall
Binary build 618 provided by ActiveState Tool Corp.
http://www.ActiveState.com
Built 21:03:54 Sep 13 2000

Jørgen Sørensen



 
 
N/A (27-11-2000)
Kommentar
Fra : N/A


Dato : 27-11-00 00:32



Jakob Schmidt (27-11-2000)
Kommentar
Fra : Jakob Schmidt


Dato : 27-11-00 00:32

"Nezar Nielsen" <tumpen@fez.dk> writes:

> "Joergen Soerensen" <Joergen.Soerensen@skolekom.dk> wrote in message
> news:8vqv8c$17lf$1@news.cybercity.dk...
> > Jeg har puslet lidt med nedenstående script...[]
>
> Dit script giver nogle fejlbeskeder, den første kan du ordne med at undgå at
> udskrive tekst til browseren, før headeren (udskriv Content-type osv.. før
> noget andet output!)

(og Jørgen - husk, at hvis du sender en Location: header, så er der nok
ingen, der kommer til at læse resten af det, du sender

> Den anden må du støve op i CGI.pm's dokumentation... så vidt jeg husker
> giver $req->param('filuploadfeltnavn') ikke indholdet af filen i en streng,
> men derimod navnet på den fil der er uploadet,

Det er rigtigt, men det er faktisk så visseligt indrettet, at det _samtidig_
er et åbent filehandle til den uploadede fil (eller den temporære kopi
på serveren, selvfølgelig). Fra CGI.pm .pod'en:

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

> Det kan være du kan få nogle af fejlbeskederne smidt ud til browseren, hvis
> du rykker din print "Content-type..osv" op i starten af scriptet..

Prøv denneher, Jørgen - den er guld værd:

use strict;
use CGI::Carp qw(fatalsToBrowser);

check perldoc CGI::Carp...

Og Jørgen, - du skriver

> > my $fileName = $file;
> > $fileName =~ s!^.*(\\|\/)!!;
> > $newmain = $fileName;
> > if ($tillad_alle ne "ja") {
> > if (lc(substr($newmain,length($newmain) - 4,4)) ne $fil_efternavn) {
> > $filenotgood = "yes";
> > }
> > }
> > if ($filenotgood ne "yes") {
> > open (OUTFILE, ">$basedir/$fileName");
> > print "$basedir/$fileName<br>";

- alt det der med $newmain det er da helt overflødigt. Hvorfor ikke bare
tage substr() osv på $fileName. Og forresten kan du få de sidste fire tegn
ved at give substr() et negativt offset (-4) og udelade længden.

Strengt taget skulle du nok blot bruge $file og så vente med at ekstrikere
$fileName til du ved, om du får brug for den, men det er i den pernittengrynede
afdeling

Og her har du en syntaksfejl:

> > while (my $bytesread = read($file, my $buffer, 1024))
> >
> > print OUTFILE $buffer;
> > }

Der skal nok stå '{' tilsidst i "while" linien.

--
Jakob Schmidt
http://aut.dk/orqwood
etc.

Nezar Nielsen (27-11-2000)
Kommentar
Fra : Nezar Nielsen


Dato : 27-11-00 12:04

"Jakob Schmidt" <sumus@aut.dk> skrev i en meddelelse
news:r93ynwcn.fsf@macforce.sumus.dk...
> "Nezar Nielsen" <tumpen@fez.dk> writes:
>
> > Den anden må du støve op i CGI.pm's dokumentation... så vidt jeg husker
> > giver $req->param('filuploadfeltnavn') ikke indholdet af filen i en
streng,
> > men derimod navnet på den fil der er uploadet,
>
> Det er rigtigt, men det er faktisk så visseligt indrettet, at det
_samtidig_
> er et åbent filehandle til den uploadede fil (eller den temporære kopi
> på serveren, selvfølgelig). Fra CGI.pm .pod'en:
>
> The filename returned is also a file handle. You can read
> the contents of the file using standard Perl file reading
> calls[...]
>

Ja, efter lidt kiggeri i CGI.pm pod'en fandt jeg det her, jeg havde i
tankerne:
(kan også ses her:
<url:http://theoryx5.uwinnipeg.ca/CPAN/data/CGI.pm/CGI.html#CREATING_A_FILE_
UPLOAD_FIELD>)

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;
}

However, there are problems with the dual nature of the upload fields.
If you `use strict', then Perl will complain when you try to use a
string as a filehandle. You can get around this by placing the file
reading code in a block containing the `no strict' pragma. More
seriously, it is possible for the remote user to type garbage into the
upload field, in which case what you get from param() is not a
filehandle at all, but a string.

To be safe, use the *upload()* function (new in version 2.47). When
called with the name of an upload field, *upload()* returns a
filehandle, or undef if the parameter is not a valid filehandle.

$fh = $query->upload('uploaded_file');
while (<$fh>) {
print;
}

This is the recommended idiom.

--
Mvh. Nezar Nielsen
http://fez.dk/




Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste