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.
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
file_uploads
Värdet av file_uploads
direktivet bör sättas till På
att tillåta filuppladdningar. Standardvärdet av detta direktiv är På
.
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.
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']); ?>
Ä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 enctype
attribut, 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.
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.
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.
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!