Søger du en specifik kategori?

 



Oprettet tir. d. 03. februar 2009 kl. 21:54

jakobdo
jakobdo (181.692 point)
www.codebreaker.dk
Guidens karaktér
1
2
3
4
5

Simpel upload af filer

Jeg ser tit brugere spørge til hvordan man uploader en fil via php. Nu vil jeg prøve ganske kort at lave lidt kode og forklare kort hvad der skal til. PS: Min første artikel.
Vi skal bruge en form
Når der er tale om upload af filer, skal man huske at anvende enctype="multipart/form-data" i formen, samt input type="file"

echo '<form action="upload.php" method="post" enctype="multipart/form-data">';
echo 'File ('.implode(',',$allowedFileTypes).'): <input type="file" name="myFile"><br />';
echo '<input type="submit" name="myUpload" value="Upload file">';
echo '</form>';


Konfiguration
Man ønsker oftest at samle alle uploadede filer, men omvendt ønsker vi ikke en ondsindet bruger kan uploade f.eks. et php script, der slette alle vores filer.

$uploadDir = 'upload/'; //Bibliotek hvor filer uploades til - husk chmod 777
$allowedFileTypes = array('jpg','gif','png'); //Hvilke filer vil vi acceptere bliver uploadet?


Selve upload koden
Det meste bliver kommenteret i koden, men tjekket på filendelsen er tilføjet, da det er eneste måde at sikre sig mod at onde personer uploader filer man ikke ønsker. Når en fil bliver uploadet, kan man bruge $_FILES['myFile']['type'] som ved upload at et jpg billede, vil indeholde image/jpeg. Dette er dog ikke sikkert og kan udformes således, at en $_FILES['myFile']['type'] indeholder image/jpeg men selve filen rent faktisk er php-kode.


//Er der trykket på Upload file knappen?
if(isset($_POST['myUpload']))
{
  //Har vi en fil?
  if(is_uploaded_file($_FILES['myFile']['tmp_name']))
  {
    //Filendelse
    $extension = strtolower(pathinfo($_FILES['myFile']['name'],PATHINFO_EXTENSION));
   
    //Er filen en af de filer vi gerne vil have?
    if(in_array($extension,$allowedFileTypes))
    {
      //Vi flytter filen fra tmp til vores UPLOADDIR
      if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . basename($_FILES['myFile']['name'])))
      {
        echo '<h3 style="color:green;">File ('.basename($_FILES['myFile']['name']).') uploaded succesfully</h3>';
      }
      else
      {
        echo '<h3 style="color:red;">Error - unable to upload file: '.basename($_FILES['myFile']['name']).'</h3>';
      }
    }
    else
    {
      echo '<h3 style="color:red;">Wrong filetype, allowed filetypes are: ('.implode(',',$allowedFileTypes).')</h3>';
    }
  }
  else
  {
    echo '<h3 style="color:red;">No file selected</h3>';
  }
}



Den fulde kode
Gem koden som upload.php. Hvis filen gemmes under andet navn, så husk at ret i <form ... action="NAVN_PÅ_FIL.php".


<?php
$uploadDir = 'upload/'; //Bibliotek hvor filer uploades til - husk chmod 777
$allowedFileTypes = array('jpg','gif','png'); //Hvilke filer vil vi acceptere bliver uploadet?

//Er der trykket på Upload file knappen?
if(isset($_POST['myUpload']))
{
  //Har vi en fil?
  if(is_uploaded_file($_FILES['myFile']['tmp_name']))
  {
    //Filendelse
    $extension = strtolower(pathinfo($_FILES['myFile']['name'],PATHINFO_EXTENSION));
   
    //Er filen en af de filer vi gerne vil have?
    if(in_array($extension,$allowedFileTypes))
    {
      //Vi flytter filen fra tmp til vores UPLOADDIR
      if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . basename($_FILES['myFile']['name'])))
      {
        echo '<h3 style="color:green;">File ('.basename($_FILES['myFile']['name']).') uploaded succesfully</h3>';
      }
      else
      {
        echo '<h3 style="color:red;">Error - unable to upload file: '.basename($_FILES['myFile']['name']).'</h3>';
      }
    }
    else
    {
      echo '<h3 style="color:red;">Wrong filetype, allowed filetypes are: ('.implode(',',$allowedFileTypes).')</h3>';
    }
  }
  else
  {
    echo '<h3 style="color:red;">No file selected<h3>';
  }
}

//Vores form
echo '<form action="upload.php" method="post" enctype="multipart/form-data">';
echo 'File ('.implode(',',$allowedFileTypes).'): <input type="file" name="myFile"><br />';
echo '<input type="submit" name="myUpload" value="Upload file">';
echo '</form>';

?>



ChangeLog:
07-05-2007 - (benneharli):
Havde glemt at tilføje / i <h3> så de blev ikke lukket korrekt.
07-05-2007 - (windcape):
Har rettet $_SERVER['PHP_SELF'] til upload.php.
07-05-2007 - (windcape):
Rettede måden hvorpå jeg tjekke filendelsen fra $extension = strtolower(end(explode('.',$_FILES['myFile']['name']))); til $extension = strtolower(pathinfo($_FILES['myFile']['name'],PATHINFO_EXTENSION));.
07-05-2007 - (windcape):
Forklaring på hvorfor filendelse skal bruges og man ikke kan stole på $_FILES['myFile']['type'].
21-07-2007 - (coderdk):
Har rettet $_FILES['myFile']['size']>0 til is_uploaded_file($_FILES['myFile']['tmp_name']).

Skrevet fre. d. 04. maj 2007 kl. 04:44| #1

meget fin. Her et et tip, $extension = pathinfo($_FILES['myFile']['name'],PATHINFO_EXTENSION); eller brug strrpos() , explode er alt for langsom i forhold. | Derudover synes jeg der mangler forklaringen på hvorfor det er mest sikkert at bruge extension check (fordi det er det). Og udover vil jeg fraråde PHP_SELF, læs http://forum.hardened-php.net/ (...)

Skrevet fre. d. 04. maj 2007 kl. 17:57| #2

benneharli (22.989 point)
Kanon... fulgte den punkt for punkt, og det spiller bare...

I eksemplet ville jeg dog sætte </h3> efter meddelelserne istedet for <h3> - ellers står det hele med stor skrift

Skrevet fre. d. 18. maj 2007 kl. 18:14| #3


Skrevet ons. d. 06. juni 2007 kl. 17:19| #4

jokerper (9.146 point)
Den er meget beskrivende. Men jeg må indrømme at jeg ikke fik sat noget sammen ud fra den. Jeg manglede det samlede overblik. Hvor mange filer drejer det sig om mv.

Så den er nok velment godt til nogle som kan temmelig meget php i forvejen.

Skrevet fre. d. 06. juli 2007 kl. 18:49| #5

freekyzone (31.061 point)
Fin artikel. Tak :-)

Skrevet ons. d. 08. august 2007 kl. 01:47| #6

coderdk (160.384 point)
Nizzle

Skrevet ons. d. 05. september 2007 kl. 11:39| #7

lwee (8.685 point)
Kan nogen hjælpe mig?
Jeg er ved at blive sindsyg, skal lave en function til min opgave hvor man skal uploade billeder. Men kan ikke finde ud af at lave det. Og får nogle fejl når jeg bruger den kode, som er på vidst oppe for oven.

Her er fejlmeldingen:
Warning: move_uploaded_file(upload/homepageskitse.png) [function.move-uploaded-file]: failed to open stream: Permission denied in /virtualhosts/wi10.ots.dk/subdomains/lasse/hovedforloeb/cms/upload.php on line 18

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/php9w4ScQ' to 'upload/homepageskitse.png' in /virtualhosts/wi10.ots.dk/subdomains/lasse/hovedforloeb/cms/upload.php on line 18
Error - unable to upload file: homepageskitse.png

Skrevet lør. d. 24. maj 2008 kl. 13:51| #8

larsholmgaard_dk (37.659 point)
Kort og præcis!

Skrevet tor. d. 05. juni 2008 kl. 19:56| #9

maqhem (19.130 point)
www.maqhem.com/
Det er sgu en god artikel. Og jeg synes, det er genialt, at du kommer ind omkring sikkerhed også, da det er en utroligt vigtig faktor, som nogen nok ikke tænker så meget over. Blandt andet mig ;) Men jeg skal nu også være ærlig, at jeg aldrig har kodet et upload-script, men det vil jeg da prøve snart. Jeg har dog lige et spørgsmål: hvad er chmod 777? Ja nu er det nok bare mig, der er dum, for jeg har ikke kodet php i herrens lang tid nu. Jeg ved, jeg har hørt det før, men jeg har fuldkommen glemt hvad det er.

Skrevet tir. d. 10. juni 2008 kl. 17:33| #10


Skrevet man. d. 19. januar 2009 kl. 13:02| #11

tom2tom (6.375 point)
Det fungerer strålende.
Eneste mysterium er, hvorfor man ikke kan sætte den til at tage imod filer større end ca 12 MB?
Har prøvet med <input type="hidden" name="MAX_FILE_SIZE" value="30000000"/> (30 MB) ud fra en forestilling om at der var en default-max. Men det ændrer intet.

Skrevet søn. d. 22. marts 2009 kl. 00:42| #12

nicolailissau (5.950 point)
Kanon artikel! Intet mindre. Kort og præcis så vi selv kan få lov til at leje videre :) Hjalp mig rigtig meget.

Skrevet tir. d. 23. november 2010 kl. 12:21| #13

DiscSunshine (1.655 point)
www.Snubii.dk
hejsa har lige prøvet det men får denne fejl nogle der kan hjælpe

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to access upload/At the Arch.jpg in /home/virtual/discsunshine.dk/public_html/upload/upload.php on line 18

Skrevet søn. d. 03. juli 2011 kl. 00:07| #14

perneis (2.915 point)
www.msflightsim.eu
virker fint med mindre filer, men er det muligt at få den til at virker med filer op til 100 mb, jeg har prøvet at sætte min php.ini til:


upload_max_filesize = 100M
post_max_size = 100M


men det lader ikke til at den vil acceptere det, er det noget du kan hjælpe mig med......

Skrevet ons. d. 13. juli 2011 kl. 23:31| #15

Ph1re (2.145 point)
Super guide. 5 stjerner herfra!

Skriv en kommentar



Mest populære guides

Guidens karakter
!!!Karaktér: 3
14 stemmer
31/01 - 2011
Af: heinzdmx

Dropbox - gratis online lagerplads

Jeg vil i denne guide forklare lidt om hvad Dropbox er og også hvordan du får mest mulig plads på Dropbox. Dropbox er kort sagt en service hvor du har dine data lagt til backup på både nettet og din egen computer.
Guidens karakter
!!!Karaktér: 4
33 stemmer
02/02 - 2009
Af: jkrons

Dato- og tidsberegninger i Excel

En introduktion til simple beregninger med dato og tid i Excel. Opdateret med afsnit om beregning af tillæg.
Excel  |  Læs »
Guidens karakter
!!!Karaktér: 4
21 stemmer
06/11 - 2011
Af: fromsej

Sådan fjerner du virus og malware

Udviklingen går stærkt på "skidt"fronten, så vi har sammensat en ny og effektiv programpakke til fjernelse af det.
Virus  |  Læs »

Log ind

   

   



   




Tips & Tricks fra PC World

Teaser billede

Top 5: Virale YouTube-videoer fra Danmark

Lægger du mærke til de mere eller mindre skjulte reklamebudskaber, når du ser videoer på nettet? Vi har taget et kig på fem utrolige danske videoer, som er blevet virale hit.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan fupper smarte svindlere dig på Facebook

Se hvordan du undgår Facebook-fup i fremtiden.


Nyheder fra Computerworld

Teaser billede

App-udvikling 2.0: Sådan er den perfekte app

ComputerViews: Den værste app-hype er ved at have lagt sig, og nu ser vi konturerne af fremtidens app-design. Men hvordan udnytter man de mobile muligheder optimalt?


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger