Avatar billede fluse Nybegynder
22. november 2008 - 15:00 Der er 13 kommentarer og
2 løsninger

Fil upload - Check af fil typer + echo af tilladte filtyper

Jeg er gået i gang med at lave et php scipt som skal kunne uploade en fil til en server, checke størrelse og filtype, og der efter sende en e-mail om at der er uploaded en fil. Men da det her er mit første forsøg på at lave noget seriøst i php, er jeg løbet ind i lidt problemer.

Jeg har testet de enkelt funktioner hver for sig, og de fleste af dem virker som de skal... den kan uploade, checke størrelse og sende mailen fint, men den stump kode der cheker for filtype er der noget galt med, den afviser alt. jeg tror måske problemet ligger i den variabel ( $ext ), der skal finde brugerens filtype, for hvis jeg echo'er den, kommer den op blank?

Det andet problem jeg har, er at når den failer en upload pga. fil typen, vil jeg have den til at echo hvad for en fil brugeren forsøgte med, og dernest hvilke fil typer der er tilladt. Til det har jeg lavet en function der skal echo fra et array, med en for løkke... løkken virker som den skal alene, men ikke når jeg bruger den inden i en function.

Håber der er nogen der kan hjelpe! =D

$target_path = "data/"; //den mappe du vil gemme i
$allowed_extensions = array('.jpg','.pdf','.zip','.ai','.rar','.gif','.png','.eps'); //tilladte fil typer
$max_filesize = 5; //den maximale filstørelse (i megabytes)
$recipient = "name@url.com"; //den email du vil modtage på når der bliver uploaded

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
$ext = substr($filename, strpos($filename,'.'), strlen($filename)-1);
$sizeval = filesize($_FILES['uploadedfile']['tmp_name']) / 1048576;
$sizepost = round($sizeval, 2);
$email = $_REQUEST['Email'] ;
$subject = $_REQUEST['navn'] . " has uploaded" . $_FILES['uploadedfile']['name'] . $ext . " to the server.";
$body .= "navn: " . $_REQUEST['navn'] . " \n";
$body .= "firmanavn: " . $_REQUEST['firmanavn'] . " \n";
$body .= "email: " . $_REQUEST['email'] . " \n";
$body .= "upload: " . $_FILES['uploadedfile']['name'] . $ext . " \n";


function post_extensions() {
for ($i=0; $i<count($allowed_extensions); $i++) {
if ($i=0) {
echo " " . $allowed_extensions[$i];
} else {
echo ", " . $allowed_extensions[$i];
}
}
}

if(in_array($ext, $allowed_extensions)) {
if($sizeval < $max_filesize) {
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
    echo "The file ".  basename( $_FILES['uploadedfile']['name']). " has been uploaded";
    mail( $recipient, $subject, $body, "From: $email" );
} else{
    echo "There was an error uploading the file, please try again!";
}

} else{
echo "Din fil fylder " . $sizepost . "mb, hvilket er for meget /n";
echo "Den maximale størrelse der er tilladt er " . $max_filesize . " megabytes.";
}

} else{
echo "Den fil du forsøger at uploade er en " . $ext . "fil hvilke ikke er tilladt. /n";
echo "Det er kun tilladt at uploade " . post_extensions() . "filer.";
}
Avatar billede tzr Nybegynder
22. november 2008 - 15:16 #1
pathinfo() giver en masse informationer om filnavne, så du ikke behøver at bruge substr() og strpos().

Du kan desuden bruge implode(", ", $allowed_extensions) istedet for din post_extensions().
Avatar billede Slettet bruger
22. november 2008 - 15:22 #2
Lige i en reminder, som du kan bruge senere hen, er at hvis du ikke har sat REGISTER GLOBAL til i dine PHP indstillinger, så virker $allowed_extension IKKE i din post_extension() funktion, da det er en variabel "ude fra".
For at løse dette, skal du bare kalde variablen "ind" i din function ved brug af "global"

ex:

$variabel = "Test";
function name() {
  global $variabel;
  echo $variabel;
}
Avatar billede tzr Nybegynder
22. november 2008 - 15:31 #3
og iøvrigt: brug ALDRIG register globals, never, EVER! :)
Avatar billede fluse Nybegynder
22. november 2008 - 15:43 #4
pathinfo() ser ganske interresant ud som alternativ, men som sagt er der her mit første forsøg på at lave php, så... jeg er ikke helt 100% på hvordan jeg skal erstatte:

$ext = substr($filename, strpos($filename,'.'), strlen($filename)-1);

Noget ala?

$temp_path = $_FILES['uploadedfile']['tmp_name'];
$ext = pathinfo($temp_path[PATHINFO_EXTENSION]);
Avatar billede showsource Seniormester
22. november 2008 - 15:45 #5
$temp_path = $_FILES['uploadedfile']['name']; // ikke tmp_name
$ext = pathinfo($temp_path[PATHINFO_EXTENSION]);
Avatar billede fluse Nybegynder
22. november 2008 - 15:50 #6
Hvorfor ikke tmp_name?

på det her tidspunkt i scriptet er filen jo kun uploadet til temp lager på servren, og ikke flyttet / navngivet endnu.
Avatar billede fluse Nybegynder
22. november 2008 - 15:53 #7
Og mange tak Roxki, det løste det ene problem :D
Avatar billede showsource Seniormester
22. november 2008 - 16:02 #8
Du kan prøve:

echo"TMP: ".$_FILES["uploadedfile"]["tmp_name"]." Filnavn: ".$_FILES["uploadedfile"]["name"]
Avatar billede tzr Nybegynder
22. november 2008 - 16:03 #9
pathinfo() retunerer en array med information om filen. Så fx.:
$path = pathinfo($_FILES["uploadedfile"]["tmp_name"]
og så lav en print_r($path) for at se hvad du har at lege med.
Avatar billede showsource Seniormester
22. november 2008 - 16:03 #10
Du har ikke de globale variablerne førend der ligger en tmpfil, så vidt jeg ved
Avatar billede Slettet bruger
22. november 2008 - 16:09 #11
fluse: du velkommen :-)
Avatar billede fluse Nybegynder
22. november 2008 - 16:55 #12
Nu virker det hele :D så mange tak til jer alle for den gode hjælp!

roxki løste et problem, tzr fik mig til at bruge file path, og showsource pointerede en fejl ilemmen name og tmp_name... så jeg syntes i alle fortjæner nogle points!

smider i nogle svar? =)

Fluse
Avatar billede tzr Nybegynder
22. november 2008 - 17:03 #13
glad for at hjælpe :)
Avatar billede Slettet bruger
22. november 2008 - 17:12 #14
jamen tak da.
Avatar billede showsource Seniormester
22. november 2008 - 18:42 #15
ok
Du skal iøvrigt være opmærksom på at det f.eks. er muligt at skrive noget javascript og gemme som f.eks. billede.jpg

Og væn dig hellere til at bruge GET eller POST i stedet for REQUEST
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester