Avatar billede hoejgaard Juniormester
28. juni 2005 - 00:32 Der er 59 kommentarer og
1 løsning

bestemme type fil inden upload af fil

Hej.
Jeg har en fil som skal uploades til serveren, men inden upload vil jeg gerne finde ud af om det er en gif eller jpg fil.
Jeg har følgende :

if (empty($_FILES['upfil']['name'])) {
                    $files= ' ';
                    $_POST[tekst] = ' ';
                 
                }
  else {
    $files = $_FILES['upfil']['name'];
   
    $file = $_FILES['upfil']['tmp_name'];
    $fil_stoerrelse = filesize($file)/1024;
    if($fil_stoerrelse > "4000") {
    //    echo "Det billede du prøver at uploade er <b>ikke</b> gyldigt - max 4000 kb = 4 MB
    //    <a href=java script:history.back(-1)>Tilbage</a>";
        include("filnavn_ikke_gyldig_profil.php"); 
        exit;
          }
      }




if (!empty($_FILES['upfil']['name'])) {
    $billede0 = tempnam('/customers/sti.dk/sti.dk/httpd.www/test/', 'f1');
    $billede0b = $billede0 . '.' . 'jpg';
    $billede = basename($billede0b);
    $konfiguration["upload_bibliotek"] = "./test";
   

/* Hvor flytter vi fra og til */
    $fra = $_FILES["upfil"]["tmp_name"];
    $til = $konfiguration["upload_bibliotek"] . "/" . $billede;

    move_uploaded_file($fra, $til);


Hvis jeg så kunne bestemme typen af $fra ville det være godt. Nogen der kan sige mig hvordan jeg gør det ??
Avatar billede Slettet bruger
28. juni 2005 - 00:45 #1
Det kunne måske gøres med:

if (substr($fra, -4) == ".gif") {
    // Det er en gif
} elseif (substr($fra, -4) == ".jpg) {
    // Det er en jpg
} else {
    // Det er noget andet
}

Jeg mener der findes en decideret funktion i PHPs lib til at bestemme en filtype, men jeg kan ikke lige finde den...! :(
Avatar billede Slettet bruger
28. juni 2005 - 00:49 #2
.. men hvis du benytter den øverste skal du nok også lige tage højde for ".GIF" og ".JPG" - det sker vidst nogle gange på Windowsmaskiner at de extensions bliver uppercase.
Avatar billede hoejgaard Juniormester
28. juni 2005 - 01:01 #3
ern det getimagesize du tænker på, men ved ikke om jeg kan bruge den før filen er uploadet ??
Avatar billede Slettet bruger
28. juni 2005 - 01:04 #4
Den fortæller vidst kun om størrelsen på billedet. Jeg kan bare huske, at der er en funktion der giver filens tilbage i arrays. I princippet burde min ovenstående funktion virke lige så godt i det her tilfælde. Men nogle gange har filer jo længere (eller ingen) extension. Men dem vil else'en så fange her, sammen med alle andre filtyper.

--
pacroon
Avatar billede hoejgaard Juniormester
28. juni 2005 - 01:25 #5
okay nu har jeg lavet det med :

if (preg_match("/\.jpe?g$/i",$files)){  }
    if (preg_match('/\.gif$/i',$files)) {  }
Avatar billede coderdk Praktikant
28. juni 2005 - 01:38 #6
Det kan du ikke. Det eneste du muligvis kan gøre, er at lave et javascript der undersøger indholdet af uploadfeltet, for at se hvad endelsen er...
Hvordan ville du køre noget på serveren, som undersøger hvad brugeren har på sin harddisk?!
Avatar billede hoejgaard Juniormester
28. juni 2005 - 02:13 #7
Øhh coderdk hvorfor kan jeg ikke dette
if (preg_match("/\.jpe?g$/i",$files)){  }
if (preg_match('/\.gif$/i',$files)) {  }

$files stammer fra en form hvor brugeren kan vælge at uploade et billede, og når der er submittet kan jeg vil godt checke endelsen med ovenstående eller hvad ??
Avatar billede coderdk Praktikant
28. juni 2005 - 02:14 #8
Fordi filen bliver jo stadig uploadet ;) Så kan du lige så godt checke filtypen med getimagesize() f.eks ;)
Avatar billede hoejgaard Juniormester
28. juni 2005 - 02:24 #9
Okay når jeg talte om før upload mente jeg før billedet er placeret endeligt på serveren, og det er det jo ikke hvis typen ikke accepteres..
coderdk hvordan ville det iøvrigt se ud med getimagesize() ??
Avatar billede coderdk Praktikant
28. juni 2005 - 02:26 #10
$info = getimagesize( $file ); // Det er $_FILES['upfil']['tmp_name']

$info[2] vil så være 1 for GIF, 2 for JPEG, 3 for PNG osv - se http://dk2.php.net/getimagesize

Det er stadig en god idé at gøre som du gør, at checke på endelsen, samtidigt ;)
Avatar billede hoejgaard Juniormester
28. juni 2005 - 12:18 #11
øh checker getimagesize ikke på endelsen da ???
Avatar billede coderdk Praktikant
28. juni 2005 - 17:05 #12
Nopes, den checker kun hvilken type billedet er, den er ligeglad om den hedder .php til sidst, hvis det er et .jpg ;)
Avatar billede coderdk Praktikant
28. juni 2005 - 17:05 #13
Og et svar fra mig :)
Avatar billede hoejgaard Juniormester
28. juni 2005 - 20:32 #14
Okay men stadig er det vel unødvendigt med getimagesize hvis dette :
if (preg_match("/\.jpe?g$/i",$files)){  }
if (preg_match('/\.gif$/i',$files)) {  }

checker endelsen.
Jeg kan ikke se hvad jeg så skal med getimagesize oveni ??
Avatar billede coderdk Praktikant
28. juni 2005 - 20:37 #15
Pointen er at folk kan uploade en .php fil, en .exe eller andet, med en .jpg endelse ;) Med getimagesize er du sikker på at det er et billede, og af hvilken type, uanset endelsen - At checke endelsen er ekstra sikkerhed, hvis der uploades filer der kaldes direkte...

Desuden burde din regex kunne laves i ét:

if (preg_match("/\.(gif|jpe?g)$/i",$files)){  }
Avatar billede hoejgaard Juniormester
28. juni 2005 - 20:41 #16
okay men hvad mener du med :..hvis der uploades filer der kaldes direkte...
??
Avatar billede coderdk Praktikant
28. juni 2005 - 20:52 #17
Hvis man kan uploade en fil "hej.jpg" og kalde den direkte http://ditsite.dk/sti/hej.jpg
Avatar billede hoejgaard Juniormester
28. juni 2005 - 21:05 #18
du mener hvis nu den hed hej.jpg.exe så kunne jeg ikke kalde den direkte ??
Avatar billede coderdk Praktikant
28. juni 2005 - 21:25 #19
Jo, jeg mener du kan kalde et billede gennem et script:

<img src="billede.php?id=123">
Avatar billede hoejgaard Juniormester
28. juni 2005 - 21:38 #20
okay nu har jeg :
$info = getimagesize( $file );

ka jeg så sige:
IF ($info[2]!=1 AND $info[2]!=2) {echo "filen er ikke jpg eller gif";)
Avatar billede coderdk Praktikant
28. juni 2005 - 21:40 #21
Yep:

if ( $info[2] != 1 && $info[2] != 2 ) { echo "filen er ikke jpg eller gif"; }
Avatar billede hoejgaard Juniormester
28. juni 2005 - 21:49 #22
okay men jeg får en fejl når jeg prøver at uploade en php fil som jeg har omdøbt til : login.php.jpg

Warning: getimagesize(): Unable to access login.php.jpg in /customers/stien.dk/stien.dk/httpd.www/opdatering_tilmelding_final_thumbnail_laverthumbnails.php on line 19

Warning: getimagesize(login.php.jpg): failed to open stream: No such file or directory

Fejlen burde jo ikke komme i den linie :
$info = getimagesize( $files);  //linie 19

men først her :
f ( $info[2] != 1 && $info[2] != 2 ) { echo "filen er ikke jpg eller gif"; }
Avatar billede coderdk Praktikant
28. juni 2005 - 21:52 #23
Fejlen du får indikerer at filen ikke findes ;)
Avatar billede hoejgaard Juniormester
28. juni 2005 - 21:53 #24
ikke findes ?? jamen jeg uploader den jo..
Avatar billede hoejgaard Juniormester
28. juni 2005 - 21:58 #25
Altså jeg har :
$files = $_FILES['upfil']['name'];                             
$info = getimagesize($files);
if ( $info[2] != 1 && $info[2] != 2 ) { echo "filen er ikke jpg eller gif"; }

Dvs så skulle login.php.jpg ikke ligge i $_FILES['upfil'['name'] ???
Avatar billede hoejgaard Juniormester
28. juni 2005 - 22:02 #26
Nu får jeg udskrevet "login.php.jpg" lige efter
$files = $_FILES['upfil']['name'];
Så ka problemet være at når man laver php filer om til jpg så kan  getimagesize ikke klare det ??
Avatar billede coderdk Praktikant
28. juni 2005 - 22:10 #27
Den uploadede fil ligger i tmp_name, så:

$files = $_FILES['upfil']['tmp_name'];
Avatar billede hoejgaard Juniormester
28. juni 2005 - 22:20 #28
okay men nu bliver login.php.jpg fanget af denne :
if (!preg_match("/\.(gif|jpe?g)$/i",$files)){filen er ikke en jpg eller gif fil  }
Avatar billede coderdk Praktikant
28. juni 2005 - 22:21 #29
Ja, dén skal bruge $_FILES['upfil']['name'] da det er brugeren eget navn, $_FILES['upfil']['tmp_name'] hedder som regel noget i stil med "/tmp/phpahf9921"
Avatar billede hoejgaard Juniormester
28. juni 2005 - 22:23 #30
Nu er jeg ikke lige med :
jeg har nu lavet det om til :
$files = $_FILES['upfil']['tmp_name'];

Hvad mener du så jeg skal gøre nu ??
Avatar billede hoejgaard Juniormester
28. juni 2005 - 22:27 #31
Status.
ved upload af login.php.jpg og med
$files = $_FILES['upfil']['tmp_name'];
$info = getimagesize($files);
så sker der det at dette udføres :

                          <? if (!empty($_FILES['upfil']['name']) && !preg_match("/\.jpe?g$/i",$files) && !preg_match('/\.gif$/i',$files)) { ?>
                          <tr><td width="7%" ><br>&nbsp;</td><td class="td17"><br><b>Du kan kun uploade jpg eller gif filer !</b></td><td width="13%"><br>&nbsp;</td></tr> <? } ?>   

Og det er jo iorden da filen ender på jpg ikke ??
Avatar billede hoejgaard Juniormester
28. juni 2005 - 22:29 #32
Altså den burde ikke gå ind i if sætningen vel..
Avatar billede hoejgaard Juniormester
28. juni 2005 - 22:46 #33
nu bruger jeg :
if(false == ($str = getimagesize($_FILES["upfil"]["tmp_name"]))) {
                            echo"Valgte fil til upload er ikke en billedfil!!!";
                            exit();
                              }
ser det ikke meget godt ud ??
Avatar billede coderdk Praktikant
28. juni 2005 - 22:46 #34
$files = $_FILES['upfil']['tmp_name'];

$files vil indeholde noget der ligner "/tmp/phpfe11a4"

Så du bør ændre:

<? if (!empty($_FILES['upfil']['name']) && !preg_match("/\.jpe?g$/i",$files) && !preg_match('/\.gif$/i',$files)) { ?>

til:

<? if (!empty($_FILES['upfil']['name']) && !preg_match("/\.(gif|jpe?g)$/i",$_FILES['upfil']['name'])) { ?>
Avatar billede coderdk Praktikant
28. juni 2005 - 22:47 #35
Jo, det sidste ser ok ud
Avatar billede hoejgaard Juniormester
28. juni 2005 - 23:07 #36
Ja det hjalp på det. tror det er på plads nu. MANGE TAK for hjælpen !
Avatar billede hoejgaard Juniormester
29. juni 2005 - 00:16 #37
øh lige en ting mere, hvis man indsætter blanke tegn i upload feltet og uploader det så brokker den sig :Warning: getimagesize(): Read error!
Hvordan undgår jeg denne melding ??
Avatar billede coderdk Praktikant
29. juni 2005 - 00:17 #38
if ( $info = @getimagesize( $files ) )
{
  // Det er ok
}
else
{
  // FEEEEEEEEEEEEEEJL :)
}
Avatar billede coderdk Praktikant
29. juni 2005 - 00:17 #39
( @ undertrykker fejlmeddelelser )
Avatar billede hoejgaard Juniormester
29. juni 2005 - 00:24 #40
ok jeg vil nu hellere spørge på om feltet er tomt, men $files != 0 virker ikke, hvad kan så være det rigtige ??
Avatar billede coderdk Praktikant
29. juni 2005 - 00:26 #41
Du kan prøve at checke for empty( $_POST['upfil'] ) eller empty( $_POST['upfil']['tmp_name'] )
Avatar billede hoejgaard Juniormester
29. juni 2005 - 00:31 #42
fint men den melder også fejl hvis jeg blot skriver noget i feltet og ikke finder en fil på pcen.
Avatar billede hoejgaard Juniormester
29. juni 2005 - 00:35 #43
altså hvis jeg bare skriver a.jpg (altså en fil der ikke eksisterer) i upload feltet så kommer fejlen
getimagesize(): Read error!
Avatar billede coderdk Praktikant
29. juni 2005 - 00:37 #44
I det tilfælde vil empty( $_POST['upfil']['tmp_name'] ) være sand, og du vil så ikke nå ned til getimagesize - Hvis du rent faktisk uploader noget, som en .zip fil med en .jpg endelse, så vil getimagesize sikkert også brokke sig, så mit råd er at gøre som jeg skriver 29/06-2005 00:17:34 :)
Avatar billede hoejgaard Juniormester
29. juni 2005 - 00:39 #45
det er her fejlen kommer :
if (!empty($_FILES['upfil']['name']) && false == ($str = getimagesize($_FILES["upfil"]["tmp_name"]))) { ?>
Avatar billede coderdk Praktikant
29. juni 2005 - 00:43 #46
Jeg ville nøjes med skrive den sådan:

if ($str = @getimagesize($_FILES["upfil"]["tmp_name"])) { ?>

Hvis det da er FEJLEN du vil udskrive i den if :)
Avatar billede hoejgaard Juniormester
29. juni 2005 - 01:14 #47
Ville nu godt ha at brugeren får at vide hvis der er uploadet en "tom" fil.. hvad kan if sætningen så være ??
Avatar billede coderdk Praktikant
29. juni 2005 - 01:26 #48
Er det ikke nok med noget i stil med:

if (!($str = @getimagesize($_FILES["upfil"]["tmp_name"])))
{
    die( 'Der kan kun uploades JPEG og GIF billeder.' );
}
Avatar billede hoejgaard Juniormester
29. juni 2005 - 01:37 #49
er det kun "tomme" filer den reagerer på eller hvad ??
Avatar billede coderdk Praktikant
29. juni 2005 - 01:37 #50
Nope, både tomme felter og filer der ikke er billeder ;)
Avatar billede hoejgaard Juniormester
29. juni 2005 - 01:51 #51
ja det var fint, så kommer der heller ikke de getimagesize(): Read error!

Håber det virker nu :-) Godnat og Mange tak !
Avatar billede hoejgaard Juniormester
29. juni 2005 - 01:53 #52
okay der er lige den ting at hvis brugeren ikke indtaster noget overhovedet så skal den ikke skrive 'Der kan kun uploades JPEG og GIF billeder.'
Avatar billede coderdk Praktikant
29. juni 2005 - 01:59 #53
Prøv med:

if (!($str = @getimagesize($_FILES["upfil"]["tmp_name"])))
{
    if ( empty( $_POST['upfil']['size'] ) || $_POST['upfil']['size'] == 0 )
    {
      die( 'Du skal uploade et JPEG- eller GIF-billede.' );
    }
    else
    {
      die( 'Der kan kun uploades JPEG og GIF billeder.' );
    }
}
Avatar billede coderdk Praktikant
29. juni 2005 - 01:59 #54
(Forklaring: Så vidt jeg lige husker kan du kun checke filstørrelsen, om du får noget)
Avatar billede hoejgaard Juniormester
29. juni 2005 - 02:06 #55
okay giver de her to det samme resultat ??

<? if (!empty($_FILES['upfil']['name']) && !preg_match("/\.(gif|jpe?g)$/i",$_FILES['upfil']['name'])) { ?>
<tr><td width="7%" ><br>&nbsp;</td><td class="td17"><br><b>Du kan kun uploade jpg eller gif filer !</b></td><td width="13%"><br>&nbsp;</td></tr> <? } ?> 
 
<? if (!($str = @getimagesize($_FILES["upfil"]["tmp_name"])) && !empty($_FILES['upfil']['name'])) { ?>
<tr><td width="7%" ><br>&nbsp;</td><td class="td17"><br><b>Du kan kun uploade jpg eller gif filer !</b></td><td width="13%"><br>&nbsp;</td></tr> <? } ?>   

Kan nemlig ikke helt forstå hvorfor $str = @getimagesize($_FILES["upfil"]["tmp_name"]) lige virker på gif og jpg filer ....
Avatar billede coderdk Praktikant
29. juni 2005 - 02:11 #56
Ikke forstået? Der står !($str = @getimagesize($_FILES["upfil"]["tmp_name"])) - så hvis getimagesize fejler og returnerer false, så er det ikke et billede ;)
Avatar billede hoejgaard Juniormester
29. juni 2005 - 02:14 #57
okay nu har jeg slået de to sammen så må jeg være dækket ind :

<? if ( (!empty($_FILES['upfil']['name']) && !preg_match("/\.(gif|jpe?g)$/i",$_FILES['upfil']['name'])) OR (!($str = @getimagesize($_FILES["upfil"]["tmp_name"])) && !empty($_FILES['upfil']['name'])) ) { ?>
<tr><td width="7%" ><br>&nbsp;</td><td class="td17"><br><b>Du kan kun uploade jpg eller gif filer !</b></td><td width="13%"><br>&nbsp;</td></tr> <? } ?> 


Ser det ikke rigtigt ud ?
Avatar billede coderdk Praktikant
29. juni 2005 - 02:21 #58
Lidt pænere:

<? if ( !empty($_FILES['upfil']['name']) &&
        (!preg_match("/\.(gif|jpe?g)$/i",$_FILES['upfil']['name'])
        || (!($str = @getimagesize($_FILES['upfil']["tmp_name"]))))) { ?>

Men det er måske bare mig :)
Avatar billede hoejgaard Juniormester
29. juni 2005 - 14:45 #59
hmme stadig en ting..
Hvis jeg uploader et billede der er for stort så skulle den skrive det, men det gør den ikke er denne forkert ?? " if (!empty($_POST['upfil']['tmp_name'])) { " :

Her er hele kodestumpen :
<? if (!empty($_POST['upfil']['tmp_name'])) {
                            if (!empty($_FILES['upfil']['name']) && false == ($str = getimagesize($_FILES["upfil"]["tmp_name"]))) { ?>
                          <tr><td width="7%" ><br>&nbsp;</td><td class="td17"><br><b>Det er ikke et billede du uploader !</b></td><td width="13%"><br>&nbsp;</td></tr> <? } ?>   
                          <? if ($fil_stoerrelse > "200" && preg_match("/\.(gif|jpe?g)$/i",$_FILES['upfil']['name'])) { ?>
                          <tr><td width="7%" ><br>&nbsp;</td><td class="td17"><br><b>Det billede du prøver at uploade er for stort, max 4 MB !</b></td><td width="13%"><br>&nbsp;</td></tr> <? } ?>                 
                            <? } ?>
Avatar billede hoejgaard Juniormester
29. juni 2005 - 15:31 #60
NÅ NU TROR jeg det virker :-)
Endnu engang MANGE tak for hjælpen !
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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