Slik laster du opp en fil i PHP (med eksempel)

I denne artikkelen vil jeg forklare grunnleggende om filopplasting i PHP. For det første vil vi gå gjennom PHP-konfigurasjonsalternativene som må være på plass for vellykkede filopplastinger. Etter dette utvikler vi et ekte eksempel på hvordan du laster opp en fil. 

Konfigurer PHP-innstillinger

Det er et par PHP-konfigurasjonsinnstillinger som du vil sjekke på forhånd for vellykkede filopplastinger. I denne delen går vi gjennom hvert enkelt alternativ som er viktig med hensyn til PHP-filopplasting. Disse alternativene kan konfigureres i php.ini fil.

Hvis du ikke er sikker på hvor du skal finne din php.ini fil, kan du bruke php_ini_loaded_file () å finne den. Bare opprett en PHP-fil på serveren din med følgende linje, og åpne den fra nettleseren.  

Her er et utdrag fra en oppsettfil med noen nyttige standardinnstillinger.

; Enten å tillate HTTP-filopplastinger. file_uploads = På; Midlertidig katalog for HTTP opplastede filer. ; Vil bruke systemstandard hvis ikke satt. ; upload_tmp_dir =; Maksimal tillatt størrelse for opplastede filer. upload_max_filesize = 16M; Maksimalt antall filer som kan lastes opp via en enkelt forespørsel max_file_uploads = 20; Maksimal størrelse på POST-data som PHP vil akseptere. post_max_size = 20M max_input_time = 60 memory_limit = 128M max_execution_time = 30

Nøkkelinnstillingene

file_uploads

Verdien av file_uploads Direktivet bør settes til å tillate filopplastinger. Standardverdien til dette direktivet er .

upload_max_filesize

De upload_max_filesize Direktivet lar deg konfigurere maksimal størrelse på den opplastede filen. Som standard er den satt til 2M (to megabyte), og du kan overstyre denne innstillingen ved hjelp av .htaccess fil også. To megabyte er ikke veldig mye av dagens standarder, så du må kanskje øke dette. Hvis du får en feil som filen overskrider upload_max_filesize Når du prøver å laste opp en fil, må du øke denne verdien. Hvis du gjør det, må du også øke post_max_size (se nedenfor). 

upload_tmp_dir

Angir en midlertidig katalog som vil bli brukt til å lagre opplastede filer. I de fleste tilfeller trenger du ikke å bekymre deg for denne innstillingen. Hvis du ikke angir det, vil systemets standardkatalogkatalog bli brukt.

post_max_size

De post_max_size Direktivet lar deg konfigurere maksimal størrelse på POST-data. Siden filer er lastet opp med POST-forespørsler, må denne verdien være større enn hva du har angitt for upload_max_filesize direktiv. For eksempel, hvis din upload_max_filesize er 16M (16 megabyte), vil du kanskje sette inn post_max_size til 20M.

max_file_uploads

Den lar deg sette maksimalt antall filer som kan lastes opp av gangen. Standard er 20, en fornuftig mengde.

max_input_time

Det er maksimalt antall sekunder som et skript får lov til å analysere inngangsdataene. Du bør sette den til en rimelig verdi hvis du har å gjøre med store filopplastinger. 60 (60 sekunder) er en god verdi for de fleste apps.

memory_limit

De memory_limit Direktivet angir maksimal mengde minne et skript kan forbruke. Hvis du står overfor problemer under opplasting av store filer, må du sørge for at verdien av dette direktivet er større enn det du har satt for post_max_size direktiv. Standardverdien er 128M (128 megabyte), så med mindre du har en veldig stor post_max_size og upload_max_filesize, du trenger ikke å bekymre deg for dette.

max_execution_time

Det er maksimalt antall sekunder et script får lov til å kjøre. Hvis du står overfor problemer under opplasting av store filer, kan du vurdere å øke denne verdien. 30 (30 sekunder) skal fungere bra for de fleste apper.

La oss nå bygge et virkelige eksempel for å demonstrere filopplasting i PHP.

Opprett HTML-skjemaet

Når du har konfigurert PHP-innstillingene, er du klar til å prøve ut PHP-filopplastingsfunksjonene.

Vår GitHub repo har noen prøvekode som jeg skal diskutere gjennom denne artikkelen. Så, hvis du vil følge med, gå videre og last den ned fra GitHub.

Vi skal lage to PHP-filer: index.php og upload.php. De index.php filen inneholder kode som er ansvarlig for visning av filopplastingsskjema. På den annen side, upload.php filen er ansvarlig for opplasting av en fil til serveren.

Også en fil vil bli lastet opp i uploaded_files katalog, så du må sørge for at denne mappen finnes og kan skrives av Internett server bruker.

I denne delen går vi gjennom nøkkeldelene av index.php fil.

La oss ta en titt på index.php fil på GitHub:

    PHP filopplasting   % s', $ _SESSION [' melding ']); ikke-satt ($ _ SESJON [ 'beskjed']); ?> 
Last opp en fil:

Selv om det kan se ut som et typisk PHP-skjema, er det en viktig forskjell i verdien av enctype attributten til

stikkord. Det må settes til multipart / skjema-data siden skjemaet inneholder filfeltet.

De enctype Attributt angir typen koding som skal brukes når skjemaet sendes inn, og det tar en av følgende tre verdier:

  • application / x-www-skjema-urlencoded: Dette er standardverdien når du ikke angir verdien av enctype attributt eksplisitt. I dette tilfellet er tegn kodet før det sendes til serveren. Hvis du ikke har filfeltet i skjemaet ditt, bør du bruke denne verdien for enctype Egenskap.
  • multipart / skjema-data: Når du bruker multipart / skjema-data verdi for enctypeattributt, det lar deg laste opp filer ved hjelp av POST-metoden. Det sørger også for at tegnene ikke er kodet når skjemaet er sendt inn.
  • text / plain: Dette brukes vanligvis ikke. Med denne innstillingen blir dataene sendt ukryptert.

Deretter sender vi filfeltet, som lar deg velge en fil fra datamaskinen.

 

Bortsett fra det, har vi vist en melding øverst i skjemaet. Denne meldingen viser statusen for filopplastingen, og den blir satt inn i en øktvariabel av upload.php manus. Vi ser nærmere på dette i neste avsnitt.

% s', $ _SESSION [' melding ']); ikke-satt ($ _ SESJON [ 'beskjed']); ?>

Så det oppsummerer index.php fil. I neste avsnitt ser vi hvordan du håndterer den opplastede filen på serversiden.

Opprett opplastingslogikken

I den forrige delen opprettet vi HTML-skjemaet som vises på klientsiden, og lar deg laste opp en fil fra datamaskinen. I denne delen ser vi motparten på serversiden som lar deg håndtere den opplastede filen.

Trekk inn koden fra upload.php fil på GitHub. Vi går gjennom viktige deler av den filen.

I upload.php fil, vi har sjekket om det er en gyldig POST-forespørsel i utgangspunktet.

hvis (isset ($ _ POST ['uploadBtn']) && $ _POST ['uploadBtn'] == 'Last opp') ...

I PHP, når en fil er lastet opp, vil $ _files superglobal variabel er fylt med all informasjon om den opplastede filen. Den er initialisert som en matrise og kan inneholde følgende informasjon for vellykket filopplasting.

  • tmp_name: Den midlertidige banen hvor filen lastes opp, lagres i denne variabelen.
  • Navn: Det faktiske navnet på filen er lagret i denne variabelen.
  • størrelse: Angir størrelsen på den opplastede filen i byte.
  • type: Inneholder mime-typen til den opplastede filen.
  • feil: Hvis det oppstår en feil under filopplasting, fylles denne variabelen med riktig feilmelding. Ved vellykket filopplasting inneholder den 0, som du kan sammenligne ved å bruke UPLOAD_ERR_OK konstant.

Etter å ha godkjent POST-forespørselen, kontrollerer vi at filopplastingen var vellykket.

hvis (isset ($ _ FILES ['uploadedFile']) && $ _FILES ['uploadedFile'] ['error'] === UPLOAD_ERR_OK) ...

Du kan se at $ _files variabel er et flerdimensjonalt array, det første elementet er navnet på filfeltet, og det andre elementet har informasjonen om den opplastede filen, som vi nettopp har diskutert ovenfor.

Hvis filopplasting er vellykket, initierer vi noen få variabler med informasjon om den opplastede filen.

// få detaljer om den opplastede filen $ fileTmpPath = $ _FILES ['uploadedFile'] ['tmp_name']; $ fileName = $ _FILES ['uploadedFile'] ['navn']; $ fileSize = $ _FILES ['uploadedFile'] ['size']; $ fileType = $ _FILES ['uploadedFile'] ['type']; $ fileNameCmps = eksplodere (".", $ filnavn); $ fileExtension = strtolower (slutt ($ fileNameCmps));

I den ovennevnte koden har vi også funnet ut utvidelsen av den opplastede filen og lagret den i $ fileExtension variabel.

Siden den opplastede filen kan inneholde mellomrom og andre spesialtegn, er det bedre å sanitisere filnavnet, og det er akkurat det vi har gjort i følgende utdrag.

$ newFileName = md5 (tid (). $ filnavn). '' . $ FileExtension;

Det er viktig at du begrenser typen fil som kan lastes opp til bestemte utvidelser, og ikke tillate alt som bruker opplastingsskjemaet. Vi har gjort det ved å sjekke utvidelsen av den opplastede filen med et sett med utvidelser som vi vil tillate å laste opp.

$ allowedfileExtensions = array ('jpg', 'gif', 'png', 'zip', 'txt', 'xls', 'doc'); hvis (in_array ($ fileExtension, $ allowedfileExtensions)) ...

Til slutt bruker vi move_uploaded_file funksjon for å flytte den opplastede filen til den bestemte plasseringen av vårt valg.

// katalogen der den opplastede filen vil bli flyttet $ uploadFileDir = './uploaded_files/'; $ dest_path = $ uploadFileDir. $ NewFileName; if (move_uploaded_file ($ fileTmpPath, $ dest_path)) $ message = 'Filen er lastet opp.';  else $ message = 'Det oppstod en feil ved å flytte filen for å laste opp katalogen. Vennligst kontroller at opplastingsmappen er skrivbar av webserver. '; 

De move_uploaded_file funksjonen tar to argumenter. Det første argumentet er filnavnet til den opplastede filen, og det andre argumentet er destinasjonsbanen hvor du vil flytte filen.

Endelig omdirigerer vi brukeren til index.php fil. Vi stiller også riktig melding i sesjonsvariabelen, som vil bli vist til brukere etter omdirigering i index.php fil.

Slik fungerer det sammen

Ikke glem å lage uploaded_files katalog og gjøre det skrivbar av Internett server bruker. Deretter fortsett å kjøre index.php fil, som skal vise filopplastingsskjemaet som ser slik ut:

Klikk på Søk knapp - som skal åpne en dialogboks som lar deg velge en fil fra datamaskinen din. Velg en fil med en av utvidelsene tillatt i vårt skript, og klikk på Laste opp knapp.

Det skal sende skjemaet, og hvis alt går bra, bør du se den opplastede filen i uploaded_files katalogen. Du kan også prøve å laste opp andre filer med utvidelser som ikke er tillatt, og se om skriptet forhindrer slike opplastinger.

Konklusjon

I dag diskuterte vi grunnleggende om filopplasting i PHP. I første halvdel av artikkelen diskuterte vi de forskjellige konfigurasjonsalternativene som må være på plass for filopplasting til arbeid. Da så vi på et ekteeksempel som viste hvordan filopplasting fungerer i PHP.

Jeg håper du har hatt glede av denne artikkelen, og gjerne posten dine spørsmål og forslag nedenfor!