Ladda upp filen till php-servern. Ett exempel på att ladda upp filer till servern (uppladdning) i PHP. Låt oss nu prata om hur man implementerar detta praktiskt

Förmodligen har många stött på frågan "Hur laddar man upp en fil till servern med JS och JQuery?".
Och förmodligen kunde inte alla göra detta. Faktum är att allt inte är så svårt som det verkar.
I den här lektionen kommer jag att beskriva processen att ladda upp en fil till en server (hosting).
Ajax-teknik används för att utbyta data mellan webbläsaren och webbservern.
JQuery-version som används i receptet: 2.2.2.

Vi skapar primitiv markup från html-taggar, huvud och kropp.
I head-taggen måste du inkludera sökvägen till jquery-biblioteket.
I exemplet använder jag jquery från google server.

I body-taggen skapar vi ett formulär som består av en input-tagg och en knapp.
Med input type="file" väljer du en fil att ladda.
Knapptaggen krävs för att köra js-koden för att överföra filen.

Vi ställer in formen name="uploader", enctype="multipart/form-data", method="POST".
Formulärnamn: name="uploader"
Formulärdatakodningsmetod: enctype="multipart/form-data"
Dataöverföringsmetod: method="POST"

Skicka in den här filen: Ladda upp

All html- och js-kod:
Skicka in den här filen: Ladda upp

Låt oss gå vidare till java-skriptkoden.
För att överföra en fil måste du överföra hela formuläret:
$("form").submit(function(e) (

Vi läser in formulärdata till en variabel:
var formData = new FormData($(this));

Därefter använder vi ajax-teknik för att överföra data till webbservern.
Om filöverföringen lyckas visas ett meddelande i ett popup-fönster.
Om ett fel uppstår eller om filen saknas kommer ett meddelande att visas med texten för det problem som har uppstått.
$.ajax(( url: "fil.php", typ: "POST", data: formData, async: false, success: function (msg) ( alert(msg); ), error: function(msg) ( alert( "Fel!"); ), cache: false, contentType: false, processData: false ));

All kod är i java-skript med jquery:

Nu återstår bara serversidans kod för att ta emot data från formuläret med POST-begäran.

Vi hämtar webbplatsens rotkatalog och tilldelar en mapp för nedladdning av filer:
$uploaddir = $_SERVER["DOCUMENT_ROOT"].DIRECTORY_SEPARATOR."uppladdningar".DIRECTORY_SEPARATOR;

Läser den nedladdade filen:
$uploadfile = $uploaddir . basnamn($_FILES["användarfil"]["namn"]);

Kontrollerar om filen är laddad.
I enlighet med inkommande data tilldelar vi ett medföljande meddelande.
Om filen inte laddas upp laddar du upp den till katalogen som anges i $uploadfile:
if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploadfile)) ( $out = "Filen är giltig och laddades upp.\n"; ) else ( $out = "Möjlig filuppladdningsattack !\n"; )

När de angivna åtgärderna utförs returneras ett svar.

All kod i php:

Allt html-kod inklusive js:

Skicka in den här filen: Ladda upp $("form").submit(function(e) ( var formData = new FormData($(this)); $.ajax(( url: "file.php", skriv: "POST", data: formData, async: false, success: function (msg) ( alert(msg); ), error: function(msg) ( alert("Fel!"); ), cache: false, contentType: false, processData: false )); e.preventDefault(); ));

Ladda ner källkodsfil:


Vad har foton i ett onlinefotoalbum, bifogade till ett e-postmeddelande eller filer som skickats till en batchbearbetningsansökan online gemensamt? Alla måste laddas upp till servern via Internet från en webbläsare. Faktum är att filuppladdning är en viktig funktion för många av de webbplatser och webbapplikationer vi använder dagligen. I den här artikeln kommer du att lära dig hur du lägger till filuppladdningsstöd till din webbplats med PHP.

Krav innan du laddar upp filer

Att bearbeta nedladdade filer är en standardprocess, men det finns några små saker du måste vara uppmärksam på innan du börjar. Det första du måste se till är att PHP är konfigurerat och låter dig ladda upp filer. För att göra detta bör du kontrollera file_uploads-direktivet i php.ini, och om det är inaktiverat, aktivera det.

File_uploads = På

Uppladdade filer sparas först i en tillfällig katalog (men oroa dig inte... ditt PHP-skript kan senare flytta filerna till en mer lämplig plats). Källplatsen är den tillfälliga standardkatalogen för systemet. Du kan ange en annan katalog med direktivet upload_tmp_dir i php.ini. Oavsett vilket är det en bra idé att kontrollera att PHP-processen har rätt skrivbehörighet beroende på vilken katalog som används.

Upload_tmp_dir = "/tmp" tboronczyk@zarkov:~$ ls -l / | grep tmp drwxrwxrwt 13 root root 40960 2011-08-31 00:50 tmp

När du är säker på att konfigurationen tillåter servern att acceptera uppladdade filer kan du fokusera på detaljerna och lägga till HTML-formuläret. Det är extremt viktigt att ditt element använder POST-metoden och har enctype-attributet inställt på multipart/form-data .

Stadier för att ladda upp en fil till servern

Troligtvis kan du redan föreställa dig hur filer laddas upp till servern, baserat på din egen erfarenhet och de krav som jag nämnde ovan.

  • Besökaren ser en HTML-sida med ett formulär som är speciellt skrivet för att stödja filuppladdning;
  • Därefter tillhandahåller han filen han vill ladda ner och klickar på knappen Skicka;
  • Webbläsaren kodar filen och skickar den som en del av POST-begäran;
  • PHP tar emot inlämningsformuläret, avkodar filen och lagrar den på en tillfällig plats på servern;
  • Det skrivna PHP-skriptet som ansvarar för att bearbeta formulärmeddelandet inspekterar filen och bearbetar den på något sätt, ofta flyttar den från sin tillfälliga plats till en permanent plats där filen kommer att lagras.

För att lägga till filuppladdningsstöd måste du skapa ett HTML-formulär som kommer att presenteras för användaren och ett PHP-skript som tar hand om den uppladdade filen på servern.

Lägga till ett HTML-formulär för att ladda upp en fil

HTML-formulär tillhandahåller ett gränssnitt genom vilket användaren initierar en filuppladdning. En sak att komma ihåg är att elementet måste ha sitt metodattribut inställt för att publicera och dess enctype-attribut inställt på multipart/form-data . Filelementet tillhandahåller ett fält som används för att specificera filen som ska laddas. Precis som alla andra formulärelement är det viktigt att tillhandahålla ett namnattribut så att du kan referera till det i PHP-skriptet som bearbetar formuläret.

Så här ser en typisk layout för filuppladdning ut:


Det är värt att notera att olika webbläsare renderar filuppladdningsfältet olika. IE, Firefox och Opera visar det som en textruta med en knapp bredvid som säger "Bläddra" eller "Välj". Safari visar det precis som en knapp som säger "Välj fil." I stort sett är detta inget problem eftersom användarna har vant sig vid hur fältet visas i deras webbläsare och vet hur de ska använda det. Ibland kommer du dock att stöta på en kund eller designer som är stenhård på att presentera det på ett visst sätt. Mängden CSS och JavaScript som kan appliceras på ett filfält är extremt begränsad på grund av säkerhetsöverväganden från webbläsare. Att skriva en fil kan vara svårt. Om utseendeär mycket viktigt för dig, jag rekommenderar att du läser en av artiklarna "Peter-Paul Koch" input type = "file".

Gå till servern och arbeta med PHP

Filnedladdningsinformation tillhandahålls med $_FILES flerdimensionella array. Denna array har sin egen struktur, tilldelade namn för filfälten i HTML-formuläret, precis som när man arbetar med $_GET och $_POST. Varje fils array innehåller sedan följande element:

  • $_FILES["minFil"]["namn"] - lagrar det ursprungliga filnamnet;
  • $_FILES["minFil"]["typ"] - sparar filens mime-typ;
  • $_FILES["minFil"]["storlek"] - sparar filstorleken (i byte);
  • $_FILES["minFil"]["tmp_name"] - lagrar namnet på den temporära filen;
  • $_FILES["myFile"]["error"] - lagrar felkoden som mottagits som ett resultat av överföringen.

Med funktionen move_uploaded_file() kan vi flytta en fil från dess tillfälliga katalog till en permanent plats. Det är också bra att använda den istället för copy() och rename() för detta ändamål, eftersom den utför ytterligare kontroller för att säkerställa att filen faktiskt laddades ner av en HTTP POST-begäran.

Om du ska spara filen med det ursprungliga namnet som användaren angett, rekommenderas det att du ser till att det är säkert att göra det. Filnamnet får inte innehålla tecken som kan påverka destinationssökvägen, såsom snedstreck. Filnamnet måste vara unikt för att undvika att skriva över befintliga med samma namn (om din applikation inte tillhandahåller detta). Du kan säkerställa detta genom att ersätta alla tecken med ett understreck, som inte är en bokstav, och sedan lägga till ett ökande nummer om en fil med det namnet redan finns.

Så här ser det ut att ta emot och bearbeta en filnedladdning med PHP:

Define("UPLOAD_DIR", "/srv/www/uploads/"); if (!empty($_FILES["minFil"])) ( $minFil = $_FILER["minFil"]; if ($minFil["fel"] !== UPLOAD_ERR_OK) ( echo "

Ett fel har uppstått.

"; exit; ) // säkerställ ett säkert filnamn $name = preg_replace("/[^A-Z0-9._-]/i", "_", $myFile["name"]); // gör skriv inte över befintlig fil $i = 0; $parts = pathinfo($name); while (file_exists(UPLOAD_DIR . $name)) ( $i++; $name = $parts["filename"] . "-" . $i . ". " . $parts["extension"]; ) // spara filen från den temporära katalogen $success = move_uploaded_file($myFile["tmp_name"], UPLOAD_DIR . $name); if (!$success) ( echo " "; exit; ) // ställ in rätt behörigheter för den nya filen chmod(UPLOAD_DIR . $namn, 0644); )

Först ser vi till att PHP-filuppladdningen till servern gick utan fel. Vi definierar sedan ett säkert filnamn som jag just beskrev ovan och flyttar sedan filen till dess målkatalog med hjälp av move_uploaded_file() . Slutligen gör vi ett chmod()-anrop för att säkerställa att den nya filen har nödvändiga behörigheter.

Säkerhetsfrågor

En är att kontrollera vilken typ av fil som laddas upp, vad det ska vara. Att förlita sig på värdet av $_FILES["myFile"]["type"] eller filnamnstillägget är inte säkert eftersom båda lätt kan förfalskas. Använd i stället funktionen exif_imagetype() för att kontrollera filens innehåll och avgöra om det faktiskt är GIF, JPEG eller ett av flera andra bildformat som stöds. Om exif_imagetype() inte är tillgänglig (funktionen kräver att Exif-tillägget är aktiverat) kan du använda getimagesize() . Arrayen som returneras till henne kommer att innehålla bildtypen, om en sådan känns igen.

// kontrollera GIF-, JPEG- eller PNG-filen $fileType = exif_imagetype($_FILES["minFil"]["tmp_name"]); $allowed = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG); if (!in_array($filtyp, $tillåten)) ( // filtyp inte tillåten...

För icke-bildfiler kan du använda exec() för att anropa filverktyget unix. den bestämmer filtypen genom att leta efter kända binära signaturer på förväntade platser.

// kontrollera PDF-filen $mime = "applikation/pdf; charset=binär"; exec("fil -bi " . $_FILES["minFil"]["tmp_name"], $out); if ($out != $mime) ( // filen är inte PDF ...

Ett annat steg du kan ta är att sätta strikta gränser för den totala storleken på POST-begäran och antalet filer som kan laddas upp. För att göra detta, ange lämpligt värde för direktiven upload_max_size , post_max_size och max_file_uploads i php.ini. Direktivet upload_max_size anger den maximala filuppladdningsstorleken. Utöver uppladdningsstorleken kan du begränsa storleken på hela POST-förfrågan med post_max_size-direktivet. max_file_uploads är ett nytt direktiv (tillagt i version 5.2.12) som begränsar antalet filuppladdningar. Dessa tre direktiv hjälper till att skydda din webbplats från attacker som försöker störa dess tillgänglighet genom att orsaka intensiva nätverkstrafik eller systemstart.

Post_max_size = 8M upload_max_size = 2M max_file_uploads = 20

Det tredje steget du kan ta för att minimera risken är att skanna dina nedladdade filer med en virusskanner. Detta är avgörande för skydd mot vanliga virus och skadlig programvara, särskilt om din webbplats utbyter filer mellan olika personer, till exempel bilagor till en webbe-postklient eller en (laglig) fildelningswebbplats. Det finns ett PHP-tillägg som ger tillgång till ClamAV, men du kan naturligtvis anropa verktyget kommandorad ClamAV precis som jag demonstrerade för filen.

Exec("clamscan --stdout " . $_FILES["minFil"]["tmp_name"], $out, $return); if ($return) ( // filen är infekterad...

Sammanfatta och dra slutsatser

Idag fick du lära dig hur upplägget går till och processen genomförs PHP nedladdningar filer till servern från din webbplats eller webbapplikation. För att en uppladdning ska lyckas måste HTML-formuläret skickas via en POST-begäran med flera dataformatering, och PHP måste tillåta uppladdningen enligt vad som anges med file_uploads-direktivet. Efter att filen har överförts använder skriptet som ansvarar för att bearbeta uppladdningen informationen som finns i $_FILES-arrayen för att flytta filen från den temporära katalogen till önskad plats. Jag har också delat med mig av några ytterligare försiktighetsåtgärder du kan vidta för att skydda dig själv och dina användare från några av de risker som är förknippade med att kunna ladda ner filer. För att säkerställa din säkerhet, kontrollera filtypen, inför strikta restriktioner för trafikbelastning och använd virussökning.

För de som kan vara intresserade finns ytterligare kod för den här artikeln tillgänglig på GitHub. Du kan bläddra, ladda ner eller klona arkivet och leka med koden för att bättre förstå hur filuppladdningsprocessen fungerar.

Idag vill jag berätta om olika situationer relaterade till att ladda upp filer till servern med PHP-skript. Jag ska försöka ge exempel på både den enklaste filuppladdningen och multiuppladdningen med hjälp av flytta uppladdad fil PHP.

För att ladda upp filer till servern. Först och främst måste du skapa ett HTML-formulär med ett filinmatningsfält. Bifoga sedan ett PHP-skript till det, som flyttar filen till den angivna katalogen. För att ladda upp en fil till servern med ett PHP-skript, följ dessa steg:

  • Skapa ett enkelt HTML-formulär: Du behöver ett enkelt formulär med möjlighet att ange en fil. Den finns i filen basic.php:
  • Grundläggande filuppladdning Grundläggande filuppladdningsfil

    Ovanstående kod krävs för att skapa formuläret. När användaren väljer en fil och klickar på knappen Ladda upp kommer formuläret att skicka data med POST-metoden på samma sida, eftersom filen basic.php är specificerad som hanterare:

    Viktigt: glöm inte att lägga till enctype=”multipart/form-data” till .

  • Vi skapar ett PHP-skript för att bearbeta nedladdningsformuläret. I PHP finns all information om uppladdade filer i den globala variabeln $_FILES. Det vill säga, med $_FILES kan du kontrollera om en fil har laddats ner. Om filen har laddats upp kan du flytta den till önskad katalog med PHP-funktionen move_uploaded_file:
  • Ovanstående kod kontrollerar om användaren har laddat ner filen. Om filen laddas ner flyttar vi filen till den angivna katalogen. I skriptet ovan flyttar vi filen till samma mapp där filen basic.php finns.

    Nedan är den fullständiga versionen av PHP flytta uppladdade filexempel:

    Grundläggande filuppladdning Grundläggande filuppladdningsfil

    Vänligen testa inte detta exempel på PHP-flyttad fil på servern. Det är inte säkerhetskompatibelt och skapades specifikt för att visa hur man laddar upp filer med PHP.

    Fråga: Varför är ovanstående skript osäkert?
    Svar: Med hjälp av skriptet ovan kan du ladda upp vilken typ av fil som helst till servern. Det vill säga, om du använder skriptet i det här formuläret på en "live"-server, kommer alla hackare att kunna ladda upp sina egna PHP-skript och hacka din webbplats och server.

    Lite senare kommer vi att prata mer i detalj om att skydda skriptet för att ladda upp filer till servern.

    Vad är $_FILES?

    $_FILES är en global variabel i PHP som $_POST eller $_GET . Det är en associativ array som innehåller information om den uppladdade filen med HTTP POST-metoden.

    Det vill säga, om vi kör print_r($_FILES) för ovanstående skript kommer vi att få följande information:

    Array ( => Array ( => upload-file-php.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh => 0 => 6887))

    Det vill säga, för varje fält i arrayen skapas ett element. Om du skapar en , kommer elementets namn också att ändras till test . Till exempel:

    Array ( => Array ( => upload-file-php.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh => 0 => 6887))

    Nu, för varje indatafil som flyttas med hjälp av flytta uppladdad fil PHP, skapas fem element (namn, typ, tmp_name, fel, storlek). Låt oss ta en närmare titt på dessa element:

  • namn: innehåller namnet på filen som laddats upp av användaren. Om du laddar abc.txt-filen i webbläsaren kommer namnelementet att kallas abc.txt ;
  • typ: typen av den uppladdade filen, eller mime-typ för att vara mer exakt. För en JPG-fil kommer detta element att ha värdet image/jpeg . Om du laddar text kommer elementet att få värdet text/plain . Mime-typen kommer att vara olika för olika filtyper. Nedan är de vanligaste mimtyperna:
    • JPEG: bild/jpeg ;
    • PNG: image/png ;
    • Text: text/plain ;
    • Ord: applikation/msword.
  • tmp_name: Tillfällig plats för den nedladdade filen. Denna sökväg kan ändras i variabeln upload_tmp_dir som anges i filen php.ini.
  • fel: felinformation. Inkluderar typen av fel som påträffades under nedladdningsprocessen. Till exempel när filstorleken överstiger maxstorleken eller när ingen fil angavs för nedladdning. För alla fel som uppstår finns det ett numeriskt värde och en konstant. Nedan finns en komplett lista över fel som kan uppstå i exemplet med PHP-flyttad fil:
    • UPLOAD_ERR_OK (värde 0) . Indikerar att filen laddades ned utan fel;
    • UPLOAD_ERR_INI_SIZE (värde 1) . Filstorleken överstiger den som anges i variabeln upload_max_filesize i filen php.ini;
    • UPLOAD_ERR_FORM_SIZE (värde 2) . Filstorleken överstiger värdet som anges i formulärvariabeln MAX_FILE_SIZE;
    • UPLOAD_ERR_PARTIAL (värde 3) . Filen har inte laddats ner helt;
    • UPLOAD_ERR_NO_FILE (värde 4) . Det finns ingen fil att ladda ner;
    • UPLOAD_ERR_NO_TMP_DIR (värde 6) . Den angivna katalogen för tillfällig lagring finns inte;
    • UPLOAD_ERR_CANT_WRITE (värde 7) . Filen kan inte skrivas till disk.
  • storlek: storleken på den uppladdade filen i byte.
  • Vad är move_uploaded_file?

    move_uploaded_file är en funktion som flyttar en uppladdad fil från en temporär katalog till en målmapp. Innan du flyttar move_uploaded_file kontrollerar PHP om filen som anges i post HTTP-metoden har laddats upp.

    Om filen lyckades flyttas får du ett sant eller falskt svar. I det första exemplet använde vi följande kodrad:

    move_uploaded_file($_FILES["inputfil"]["tmp_name"], $destiation_dir)

    Låt oss nu göra det snyggt och visa informationen:

    if(move_uploaded_file($_FILES["inputfile"]["tmp_name"], $destiation_dir))( echo "File Uploaded") else( echo "File Not uploaded")

    Ändra storleksgränsen för uppladdningsfilen

    Varje filuppladdningsformulär måste ha en storleksgräns, annars kommer användare att ladda upp skrymmande filer. Det finns två sätt att sätta en gräns för flytta uppladdad fil PHP:

    • PHP.ini-filen har en speciell variabel upload_max_filesize, som är ansvarig för den maximala storleken på uppladdade filer. Följande är en rad från php.ini som begränsar storleken på uppladdade filer till 20 MB: upload_max_filesize = 20M.
    • Om den uppladdade filen är större kommer användaren att få ett UPLOAD_ERR_INI_SIZE-fel eller värdet "2" i variabeln $_FILES. Det är viktigt att notera att värdet för variabeln upload_max_filesize inte bör överstiga värdet för variabeln post_max_size som anges i php.ini;
    • Du kan begränsa storleken på den uppladdade filen genom att placera ett dolt inmatningselement som heter UPLOAD_ERR_INI_SIZE i uppladdningsformuläret. Du kan göra så här: .

    Om du behöver öka filstorleken avsevärt, glöm inte att ändra exekveringstiden för PHP-skript.

    Hur man säkrar PHP-filuppladdningsskript

    Nu vet du hur du begränsar storleken på uppladdade filer och vet hur du identifierar vilka typer av filer som användare laddar upp. Det är dags att ta hand om säkerheten i vårt exempel på PHP-flyttuppladdade filer.

    Som ett exempel kommer vi att förhindra användare från att ladda upp jpeg-filer som är större än 1 MB. Ställ in lämplig gräns i variabeln upload_max_filesize i filen php.ini. Nedan finns en förbättrad version av skriptet:

    Säker filuppladdning Säker filuppladdningsfil

    Fleruppladdning av filer med ett PHP-skript

    Du kan ladda upp flera filer samtidigt med $_FILES och move_uploaded_file PHP. Nedan kommer jag att berätta om två sätt att ladda upp filer flera gånger med hjälp av ett PHP-skript:

  • Använder olika ingångsnamn.
  • Använder samma ingångsnamn, men använder en array.
  • 1. Använda olika ingångsnamn:

    Du kan ladda upp flera filer samtidigt med hjälp av flera inmatningselement. Som nämnts tidigare, om vi skapar flera inmatningselement, kommer flera huvudelement att skapas i $_FILES. Till exempel för formuläret nedan:

    $_FILES kommer att presentera en array med följande innehåll:

    Array ( => Array ( => 20141002_094257.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpoBWrBZ => 0 => 2669096) => Array ( => 20141002_094247/jpeg) > /Applications/XAMPP/xamppfiles/temp/phpjwUmVZ => 0 => 2207657))

    PHP flytta uppladdade filexemplet nedan bör skrivas med hänsyn till att ett element är för en avatar (bild) och det andra är för att ladda upp ett CV (fil i .doc-format):

    Uppladdning av flera filer Uppladdning av flera filer Profilbild
    Återuppta

    Idag finns en tjänst för att ladda upp en fil till en server (hosting) på alla sajter. sociala nätverk, anslagstavlor, dejtingsajter, etc. Dess kärna är att göra det möjligt för en besökare till en webbresurs att publicera sina filer (foton, dokument) på Internet.

    Det finns en betydande nackdel med att tillhandahålla denna tjänst. Faktum är att genom att tillåta att en fil laddas upp till vår server installerar vi så att säga en dörr bakom vilken konstant övervakning är nödvändig. Eftersom besökarens fil kan innehålla inte bara användbar information, utan även viral kod, som sedan kan göra det möjligt för angripare att ta över din server. Med tanke på denna nackdel är det nödvändigt att noggrant kontrollera filerna innan du laddar upp dem till servern.

    Men jag kommer inte att skrämma dig, utan snarare presentera en färdig funktion (PHP-skript) för att kontrollera och ladda upp filer till servern. Funktionen fungerar till 100%. Jag använder det själv på mina hemsidor. Denna funktion är skriven för att ladda bildfiler (foton) i .jpg, .gif, .png-format. Men om du vill kan du göra ändringar för att anpassa PHP-skriptet till dina behov.

    
    Topp