Så här laddar du upp en fil i PHP (med exempel)

I den här artikeln ska jag förklara grunderna för filuppladdning i PHP. För det första går vi igenom konfigurationsalternativen för PHP som måste vara på plats för framgångsrika filuppladdningar. Därefter utvecklar vi ett verkligt exempel på hur du laddar upp en fil. 

Konfigurera PHP-inställningar

Det finns ett par konfigurationsinställningar för PHP som du vill kontrollera i förväg för framgångsrika filuppladdningar. I det här avsnittet går vi igenom alla alternativ som är viktiga när det gäller PHP-filuppladdning. Dessa alternativ kan konfigureras i php.ini fil.

Om du inte är säker på var du ska hitta din php.ini fil, kan du använda php_ini_loaded_file () att hitta den. Skapa bara en PHP-fil på din server med följande rad och öppna den från webbläsaren.  

Här är ett utdrag ur en installationsfil med några användbara standardinställningar.

; Huruvida du tillåter HTTP-filuppladdningar. file_uploads = På; Tillfällig katalog för HTTP-uppladdade filer. ; Kommer använda systemstandarden om den inte är inställd. ; upload_tmp_dir =; Max tillåten storlek för uppladdade filer. upload_max_filesize = 16M; Maximalt antal filer som kan laddas upp via en enda förfrågan max_file_uploads = 20; Maximal storlek på POST-data som PHP accepterar. post_max_size = 20M max_input_time = 60 memory_limit = 128M max_execution_time = 30

Nyckelinställningarna

file_uploads

Värdet av file_uploads direktivet bör sättas till att tillåta filuppladdningar. Standardvärdet av detta direktiv är .

upload_max_filesize

De upload_max_filesize Direktivet tillåter dig att konfigurera den maximala storleken på den uppladdade filen. Som standard är den inställd på 2M (två megabyte), och du kan åsidosätta denna inställning med .htaccess fil också. Två megabyte är inte så mycket av dagens standarder, så du kanske måste öka detta. Om du får ett fel som filen överstiger upload_max_filesize när du försöker ladda upp en fil måste du öka detta värde. Om du gör det, se till att du också ökar post_max_size (se nedan). 

upload_tmp_dir

Ställer in en tillfällig katalog som används för att lagra uppladdade filer. I de flesta fall behöver du inte oroa dig för den här inställningen. Om du inte ställer in det kommer systemets standardtemp katalog att användas.

post_max_size

De post_max_size Direktivet tillåter dig att konfigurera maximal storlek på POST-data. Eftersom filer laddas upp med POST-förfrågningar måste det här värdet vara större än vad du har angett för upload_max_filesize direktiv. Till exempel, om din upload_max_filesize är 16M (16 megabyte), kanske du vill ställa in post_max_size till 20M.

max_file_uploads

Det låter dig ställa in det maximala antalet filer som kan laddas upp åt gången. Standard är 20, en förnuftig mängd.

max_input_time

Det är det maximala antalet sekunder som ett skript tillåts att analysera ingångsdata. Du bör ange det till ett rimligt värde om du hanterar stora filuppladdningar. 60 (60 sekunder) är ett bra värde för de flesta appar.

memory_limit

De memory_limit Direktivet anger hur mycket minne ett skript kan konsumera. Om du stöter på problem vid uppladdning av stora filer måste du se till att värdet av detta direktiv är större än vad du har ställt för post_max_size direktiv. Standardvärdet är 128M (128 megabyte), så om du inte har en mycket stor post_max_size och upload_max_filesize, du behöver inte oroa dig för det här.

max_execution_time

Det är det maximala antalet sekunder som ett skript får springa. Om du stöter på problem under uppladdning av stora filer kan du överväga att öka detta värde. 30 (30 sekunder) ska fungera bra för de flesta appar.

Låt oss nu bygga ett verkligt exempel för att visa filuppladdning i PHP.

Skapa HTML-formuläret

När du har konfigurerat PHP-inställningarna är du redo att testa PHP-filuppladdningskapaciteten.

Vår GitHub repo har några exempelkod som jag kommer att diskutera i hela denna artikel. Så, om du vill följa med, fortsätt och hämta den från GitHub.

Vi ska skapa två PHP-filer: index.php och upload.php. De index.php filinnehållskod som är ansvarig för att visa filuppladdningsformuläret. Å andra sidan, upload.php filen är ansvarig för att ladda upp en fil till servern.

Dessutom laddas en fil upp i uploaded_files katalog, så du måste se till att den här mappen finns och kan skrivas av webbserver användare.

I det här avsnittet går vi igenom nyckeldelarna i index.php fil.

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

    PHP-filuppladdning   % s', $ _SESSION [' meddelande ']); unset ($ _ SESSION [ 'meddelande']); ?> 
Ladda upp en fil:

Även om det kan se ut som en typisk PHP-form, finns det en viktig skillnad i värdet av enctype attribut av

märka. Det måste ställas in på multipart / form-data eftersom formuläret innehåller filfältet.

De enctype attribut anger vilken typ av kodning som ska användas när formuläret skickas och det tar ett av följande tre värden:

  • application / x-www-form-urlencoded: Detta är standardvärdet när du inte anger värdet för enctype attribut explicit. I det här fallet kodas tecken innan det skickas till servern. Om du inte har filfältet i din form ska du använda det här värdet för enctype attribut.
  • multipart / form-data: När du använder multipart / form-data värde för enctypeattribut, kan du ladda upp filer med POST-metoden. Det säkerställs också att tecknen inte kodas när formuläret skickas in.
  • text / plain: Detta används vanligtvis inte. Med denna inställning skickas dataen okodad.

Därefter utmatar vi filfältet, som låter dig välja en fil från din dator.

 

Bortsett från det har vi visat ett meddelande längst upp i formuläret. Detta meddelande visar statusen för filuppladdningen, och den kommer att ställas in i en session variabel av upload.php manus. Vi ser mer ut på detta i nästa avsnitt.

% s', $ _SESSION [' meddelande ']); unset ($ _ SESSION [ 'meddelande']); ?>

Så det sammanfattar index.php fil. I nästa avsnitt ser vi hur du hanterar den uppladdade filen på serverns sida.

Skapa uppladdningslogiken

I det föregående avsnittet skapade vi HTML-formuläret som visas på klientsidan och låter dig ladda upp en fil från din dator. I det här avsnittet ser vi motparten på serversidan som låter dig hantera den uppladdade filen.

Dra in koden från upload.php filen på GitHub. Vi går igenom viktiga delar av den filen.

I upload.php fil, vi har kontrollerat om det är en giltig POST-förfrågan i första hand.

om (isset ($ _ POST ['uploadBtn']) && $ _POST ['uploadBtn'] == 'Ladda upp') ...

I PHP, när en fil laddas upp, $ _FILES superglobal variabel är fylld med all information om den uppladdade filen. Den initialiseras som en array och kan innehålla följande information för framgångsrik filuppladdning.

  • tmp_name: Den temporära sökvägen där filen laddas upp sparas i den här variabeln.
  • namn: Det faktiska namnet på filen är lagrad i denna variabel.
  • storlek: Anger storleken på den uppladdade filen i byte.
  • typ: Innehåller den uppladdade filens mime-typ.
  • fel: Om det uppstod ett fel under filuppladdningen, fylls den här variabeln med rätt felmeddelande. När det gäller en lyckad filuppladdning innehåller den 0, som du kan jämföra med hjälp av UPLOAD_ERR_OK konstant.

Efter att ha validerat POST-förfrågan kontrollerar vi att filuppladdningen lyckades.

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

Du kan se att $ _FILES variabeln är en mångdimensionell array, det första elementet är namnet på filfältet och det andra elementet har information om den uppladdade filen, som vi just har diskuterat ovan.

Om filuppladdningen är framgångsrik initierar vi några variabler med information om den uppladdade filen.

// få detaljer om den uppladdade filen $ fileTmpPath = $ _FILES ['uploadedFile'] ['tmp_name']; $ fileName = $ _FILES ['uploadedFile'] ['name']; $ fileSize = $ _FILES ['uploadedFile'] ['size']; $ fileType = $ _FILES ['uploadedFile'] ['typ']; $ fileNameCmps = explodera (".", $ fileName); $ fileExtension = strtolower (slutet ($ fileNameCmps));

I ovanstående kod har vi också räknat ut förlängningen av den uppladdade filen och lagrat den i $ fileExtension variabel.

Eftersom den uppladdade filen kan innehålla mellanslag och andra specialtecken är det bättre att sanitera filnamnet, och det är precis som vi gjort i följande kod.

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

Det är viktigt att du begränsar typen av fil som kan laddas upp till vissa tillägg och inte tillåta allt som använder uppladdningsformuläret. Vi har gjort det genom att kontrollera förlängningen av den uppladdade filen med en uppsättning tillägg som vi vill tillåta för uppladdning.

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

Slutligen använder vi move_uploaded_file funktionen för att flytta den uppladdade filen till den specifika platsen i vårt val.

// katalogen där den uppladdade filen kommer att flyttas $ uploadFileDir = './uploaded_files/'; $ dest_path = $ uploadFileDir. $ NewFileName; om (move_uploaded_file ($ fileTmpPath, $ dest_path)) $ message = 'Filen har laddats upp.';  else $ message = 'Det gick inte att flytta filen för att ladda upp katalogen. Se till att uppladdningslistan är skrivbar av webbservern. '; 

De move_uploaded_file funktionen tar två argument. Det första argumentet är filnamnet på den uppladdade filen och det andra argumentet är destinationsvägen där du vill flytta filen.

Slutligen omdirigerar vi användaren till index.php fil. Vi ställer också in det lämpliga meddelandet i sessionsvariabeln, som kommer att visas för användare efter omdirigering i index.php fil.

Hur det fungerar tillsammans

Glöm inte att skapa uploaded_files katalog och gör det skrivbart av webbserver användare. Fortsätt sedan och springa index.php fil, som ska visa filöverföringsformen som ser ut så här:

Klicka på Bläddra knapp - som ska öppna en dialogruta som låter dig välja en fil från din dator. Välj en fil med en av de tillägg som är tillåtna i vårt skript och klicka på Ladda upp knapp.

Det ska skicka formuläret, och om allt går bra borde du se den uppladdade filen i uploaded_files katalogen. Du kan också försöka ladda upp andra filer med tillägg som inte är tillåtna, och kontrollera om vårt skript förhindrar sådana uppladdningar.

Slutsats

Idag diskuterade vi grunderna för filuppladdning i PHP. I den första halvan av artikeln diskuterade vi de olika konfigurationsalternativen som måste vara på plats för filuppladdning till jobbet. Sedan tittade vi på ett verkligt exempel som visade hur filuppladdning fungerar i PHP.

Jag hoppas att du har haft den här artikeln, och gärna posta dina frågor och förslag nedan!