Een bestand uploaden in PHP (met voorbeeld)

In dit artikel leg ik de basisprincipes uit van het uploaden van bestanden in PHP. Allereerst gaan we door de PHP-configuratie-opties die moeten worden geïnstalleerd voor het uploaden van bestanden. Daarna ontwikkelen we een realistisch voorbeeld van hoe een bestand te uploaden. 

Configureer PHP-instellingen

Er zijn een aantal PHP-configuratie-instellingen die u van tevoren wilt controleren op succesvolle bestandsuploads. In deze sectie zullen we elke optie bekijken die belangrijk is met betrekking tot het uploaden van PHP-bestanden. Deze opties kunnen worden geconfigureerd in de php.ini het dossier.

Als u niet zeker weet waar u uw kunt vinden php.ini bestand, kunt u de php_ini_loaded_file () om het te vinden. Maak gewoon een PHP-bestand op uw server met de volgende regel en open het vanuit de browser.  

Hier is een fragment uit een setup-bestand met enkele handige standaardwaarden.

; Of u HTTP-bestandsuploads wilt toestaan. file_uploads = Aan; Tijdelijke map voor HTTP-geüploade bestanden. ; Zal systeemstandaard gebruiken indien niet ingesteld. ; upload_tmp_dir =; Maximaal toegestane grootte voor geüploade bestanden. upload_max_filesize = 16M; Maximumaantal bestanden dat kan worden geüpload via een enkel verzoek max_file_uploads = 20; Maximale grootte van POST-gegevens die PHP accepteert. post_max_size = 20M max_input_time = 60 memory_limit = 128M max_execution_time = 30

De sleutelinstellingen

file_uploads

De waarde van de file_uploads richtlijn moet worden ingesteld op Op om bestandsuploads toe te staan. De standaardwaarde van deze richtlijn is Op.

upload_max_filesize

De upload_max_filesize richtlijn stelt u in staat de maximale grootte van het geüploade bestand te configureren. Standaard staat deze ingesteld op 2M (twee megabytes), en u kunt deze instelling negeren met behulp van de .htaccess bestand ook. Twee megabytes is niet erg volgens de huidige normen, dus je moet dit misschien verhogen. Als je een foutmelding krijgt bestand overschrijdt upload_max_filesize wanneer u een bestand probeert te uploaden, moet u deze waarde verhogen. Als je dat doet, zorg er dan voor dat je ook verhoogt post_max_size (zie hieronder). 

upload_tmp_dir

Stelt een tijdelijke map in die wordt gebruikt om geüploade bestanden op te slaan. In de meeste gevallen hoeft u zich geen zorgen te maken over deze instelling. Als u dit niet instelt, wordt de standaard tempdirectory van het systeem gebruikt.

post_max_size

De post_max_size richtlijn stelt u in staat om de maximale grootte van POST-gegevens te configureren. Aangezien bestanden worden geüpload met POST-aanvragen, moet deze waarde groter zijn dan wat u hebt ingesteld voor de upload_max_filesize richtlijn. Bijvoorbeeld als u upload_max_filesize is 16M (16 megabytes), wilt u misschien instellen post_max_size naar 20M.

max_file_uploads

Hiermee kunt u het maximale aantal bestanden instellen dat tegelijkertijd kan worden geüpload. De standaard is 20, een verstandige hoeveelheid.

max_input_time

Het is het maximale aantal seconden dat een script de invoergegevens mag ontleden. U moet dit op een redelijke waarde instellen als u te maken hebt met grote bestandsuploads. 60 (60 seconden) is een goede waarde voor de meeste apps.

memory_limit

De memory_limit richtlijn geeft de maximale hoeveelheid geheugen aan die een script kan gebruiken. Als u problemen ondervindt bij het uploaden van grote bestanden, moet u ervoor zorgen dat de waarde van deze richtlijn groter is dan wat u hebt ingesteld voor de post_max_size richtlijn. De standaardwaarde is 128M (128 megabytes), tenzij je een hele grote hebt post_max_size en upload_max_filesize, u hoeft zich hier geen zorgen over te maken.

max_execution_time

Het is het maximale aantal seconden dat een script mag worden uitgevoerd. Als u problemen ondervindt bij het uploaden van grote bestanden, kunt u overwegen deze waarde te verhogen. 30 (30 seconden) zou goed moeten werken voor de meeste apps.

Laten we nu een voorbeeld uit de praktijk bouwen om het uploaden van bestanden in PHP te demonstreren.

Maak het HTML-formulier aan

Zodra je de PHP-instellingen hebt geconfigureerd, kun je de uploadmogelijkheden van PHP uitproberen.

Onze GitHub-repo heeft enkele voorbeeldcodes die ik in dit artikel zal bespreken. Dus als je wilt volgen, ga je gang en download het van GitHub.

We gaan twee PHP-bestanden maken: index.php en upload.php. De index.php bestand houdt de code bij die verantwoordelijk is voor het weergeven van het bestanduploadformulier. Aan de andere kant, de upload.php bestand is verantwoordelijk voor het uploaden van een bestand naar de server.

Er zal ook een bestand worden geüpload in de uploaded_files map, dus u moet ervoor zorgen dat deze map bestaat en beschrijfbaar is door de web Server gebruiker.

In dit gedeelte gaan we door de belangrijkste delen van de index.php het dossier.

Laten we eens kijken naar de index.php bestand op GitHub:

    PHP-bestand uploaden   % s', $ _SESSION [' message ']); unset ($ _ SESSION [ 'boodschap']); ?> 
Een bestand uploaden:

Hoewel het er misschien uitziet als een typische PHP-vorm, is er een belangrijk verschil in de waarde van de enctype attribuut van de

label. Het moet worden ingesteld op multipart / form-data aangezien het formulier het bestandsveld bevat.

De enctype kenmerk geeft het type codering aan dat moet worden gebruikt wanneer het formulier wordt verzonden en het heeft een van de volgende drie waarden nodig:

  • application / x-www-form-urlencoded: Dit is de standaardwaarde wanneer u de waarde van de waarde niet instelt enctype kenmerk expliciet. In dit geval worden tekens gecodeerd voordat deze naar de server worden verzonden. Als u het bestandsveld niet in uw formulier hebt, moet u deze waarde gebruiken voor de enctype attribuut.
  • multipart / form-data: Wanneer u de multipart / form-data waarde voor de enctypekenmerk, hiermee kunt u bestanden uploaden met de POST-methode. Bovendien zorgt het ervoor dat de tekens niet worden gecodeerd wanneer het formulier wordt verzonden.
  • text / plain: Dit wordt over het algemeen niet gebruikt. Met deze instelling worden de gegevens ongecodeerd verzonden.

Vervolgens voeren wij het bestandsveld uit, waarmee u een bestand op uw computer kunt selecteren.

 

Afgezien daarvan hebben we een bericht boven aan het formulier weergegeven. Dit bericht toont de status van het uploaden van het bestand en het zal in een sessievariabele worden ingesteld door de upload.php script. We zullen hier meer in de volgende sectie naar kijken.

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

Dus dat somt de index.php het dossier. In het volgende gedeelte zullen we zien hoe we het geüploade bestand aan de serverkant moeten afhandelen.

Maak de uploadlogica

In het vorige gedeelte hebben we het HTML-formulier gemaakt dat aan de clientzijde wordt weergegeven en waarmee u een bestand vanaf uw computer kunt uploaden. In dit gedeelte zien we de tegenhanger aan de server waarmee u het geüploade bestand kunt afhandelen.

Trek de code van de upload.php bestand op GitHub. We zullen de belangrijke delen van dat bestand doornemen.

In de upload.php bestand, hebben we in de eerste plaats gecontroleerd of het een geldig POST-verzoek is.

if (isset ($ _ POST ['uploadBtn']) && $ _POST ['uploadBtn'] == 'Upload') ...

In PHP, wanneer een bestand is geüpload, de $ _FILES superglobal-variabele bevat alle informatie over het geüploade bestand. Het is geïnitialiseerd als een array en kan de volgende informatie bevatten voor het succesvol uploaden van bestanden.

  • tmp_name: Het tijdelijke pad waar het bestand wordt geüpload, wordt opgeslagen in deze variabele.
  • naam: De werkelijke naam van het bestand wordt opgeslagen in deze variabele.
  • grootte: Geeft de grootte van het geüploade bestand aan in bytes.
  • type: Bevat het mime-type van het geüploade bestand.
  • fout: Als er een fout optreedt tijdens het uploaden van het bestand, wordt deze variabele gevuld met de juiste foutmelding. In het geval van een succesvolle bestandsupload, bevat deze 0, die u kunt vergelijken met behulp van de UPLOAD_ERR_OK constante.

Na het valideren van het POST-verzoek, controleren we of het uploaden van het bestand gelukt is.

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

Je kunt zien dat het $ _FILES variabele is een multidimensionale matrix, het eerste element is de naam van het bestandsveld en het tweede element heeft de informatie over het geüploade bestand, zoals we hierboven hebben besproken.

Als het uploaden van het bestand succesvol is, initialiseren we een paar variabelen met informatie over het geüploade bestand.

// krijg details van het geüploade bestand $ fileTmpPath = $ _FILES ['uploadedFile'] ['tmp_name']; $ fileName = $ _FILES ['uploadedFile'] ['name']; $ fileSize = $ _FILES ['uploadedFile'] ['size']; $ fileType = $ _FILES ['uploadedFile'] ['type']; $ fileNameCmps = explode (".", $ fileName); $ fileExtension = strtolower (end ($ fileNameCmps));

In het bovenstaande fragment hebben we ook de extensie van het geüploade bestand gevonden en opgeslagen in de $ FileExtension veranderlijk.

Omdat het geüploade bestand spaties en andere speciale tekens kan bevatten, is het beter om de bestandsnaam te ontsmetten, en dat is precies wat we in het volgende fragment hebben gedaan.

$ newFileName = md5 (time (). $ fileName). '' . $ FileExtension;

Het is belangrijk dat u het type bestand beperkt dat kan worden geüpload naar bepaalde extensies en niet alles toestaat met behulp van het uploadformulier. We hebben dat gedaan door de extensie van het geüploade bestand te controleren met een reeks extensies die we willen toestaan ​​om te uploaden.

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

Ten slotte gebruiken we de move_uploaded_file functie om het geüploade bestand naar de specifieke locatie van onze keuze te verplaatsen.

// map waarin het geüploade bestand wordt verplaatst $ uploadFileDir = './uploaded_files/'; $ dest_path = $ uploadFileDir. $ NewFileName; if (move_uploaded_file ($ fileTmpPath, $ dest_path)) $ message = 'Bestand is succesvol geüpload.';  else $ message = 'Er is een fout opgetreden bij het verplaatsen van het bestand naar de uploaddirectory. Zorg ervoor dat de upload-map beschrijfbaar is door de webserver. '; 

De move_uploaded_file functie heeft twee argumenten nodig. Het eerste argument is de bestandsnaam van het geüploade bestand en het tweede argument is het doelpad waarnaar u het bestand wilt verplaatsen.

Uiteindelijk leiden we de gebruiker door naar de index.php het dossier. Ook stellen we het juiste bericht in de sessievariabele in, die aan gebruikers wordt getoond na omleiding in de index.php het dossier.

Hoe het allemaal samen werkt

Vergeet niet om het te maken uploaded_files map en maak het beschrijfbaar door de web Server gebruiker. Ga vervolgens door en voer de index.php bestand, dat het bestandsuploadformulier zou moeten weergeven dat er als volgt uitziet:

Klik op de Blader knop - die een dialoogvenster moet openen waarin u een bestand op uw computer kunt selecteren. Selecteer een bestand met een van de toegestane extensies in ons script en klik op de Uploaden knop.

Dat zou het formulier moeten indienen, en als alles goed gaat, zou u het geüploade bestand moeten zien in de uploaded_files directory. Je kunt ook proberen andere bestanden te uploaden met extensies die niet zijn toegestaan ​​en controleer of ons script dergelijke uploads voorkomt.

Conclusie

Vandaag bespraken we de basisprincipes van het uploaden van bestanden in PHP. In de eerste helft van het artikel hebben we de verschillende configuratie-opties besproken die aanwezig moeten zijn voor het uploaden van bestanden naar het werk. Daarna keken we naar een voorbeeld uit de praktijk dat aantoonde hoe bestandsupload werkt in PHP.

Ik hoop dat je dit artikel leuk vond en aarzel niet om hieronder je vragen en suggesties te plaatsen!