POST-metodens uppladdningar

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

POST-metoduppladdningar

Den här funktionen låter användare ladda upp både text- och binärfiler. Med PHP:s autentisering och filhanteringsfunktioner har du full kontroll över vem som får ladda upp filer och vad som ska göras med filen när den har laddats upp.

PHP kan ta emot filuppladdningar från alla RFC-1867-kompatibla webbläsare.

Obs: Relaterade konfigurationsinställningar Se även direktiven `file_uploads`, `upload_max_filesize`, `upload_tmp_dir`, `post_max_size` och `max_input_time` i php.ini.

PHP stöder också filuppladdningar med PUT-metoden, som används av Netscape Composer och W3C:s Amaya-klienter. Se stöd för PUT-metoden för mer information.

Exempel #1 Filuppladdningsformulär

Ett filuppladdningsformulär kan byggas genom att skapa ett speciellt formulär som ser ut så här:

<!-- Datakodningstypen, enctype, MÅSTE anges enligt nedan -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE måste föregå filinmatningsfältet -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Namnet på inmatningselementet avgör namnet i $_FILES-arrayen -->
    Skicka den här filen: <input name="userfile" type="file" />
    <input type="submit" value="Skicka filen" />
</form>

__URL__ i exemplet ovan bör ersättas och peka på en PHP-fil.

Det dolda fältet `MAX_FILE_SIZE` (mätt i byte) måste föregå filinmatningsfältet, och dess värde är den maximala filstorleken som accepteras av PHP. Detta formelement bör alltid användas eftersom det sparar användarna besväret med att vänta på att en stor fil överförs bara för att upptäcka att den var för stor och överföringen misslyckades. Kom ihåg: att manipulera den här inställningen på klientsidan är ganska enkelt, så lita aldrig på att filer med större storlek blockeras av denna funktion. Det är bara en bekvämlighetsfunktion för användare på klientsidan av applikationen. PHP-inställningarna (på serversidan) för maxstorlek kan dock inte manipuleras.

Obs: Se till att ditt filuppladdningsformulär har attributet `enctype="multipart/form-data"` annars kommer filuppladdningen inte att fungera.

Den globala `$_FILES`-variabeln kommer att innehålla all information om den uppladdade filen. Dess innehåll från exempelformuläret är som följer. Notera att detta förutsätter att filuppladdningsnamnet är `userfile`, som används i exempelsskriptet ovan. Detta kan vara vilket namn som helst.

  • `$_FILES['userfile']['name']` - Det ursprungliga namnet på filen på klientens dator.
  • `$_FILES['userfile']['type']` - Filens MIME-typ, om webbläsaren tillhandahöll denna information. Ett exempel skulle vara "image/gif". Denna MIME-typ kontrolleras dock inte på PHP-sidan och därför bör du inte lita på dess värde.
  • `$_FILES['userfile']['size']` - Storleken, i byte, på den uppladdade filen.
  • `$_FILES['userfile']['tmp_name']` - Det temporära filnamnet på filen där den uppladdade filen lagrades på servern.
  • `$_FILES['userfile']['error']` - Felkoden som är associerad med denna filuppladdning.
  • `$_FILES['userfile']['full_path']` - Den fullständiga sökvägen som skickades in av webbläsaren. Detta värde innehåller inte alltid en verklig katalogstruktur och kan inte litas på. Tillgängligt sedan PHP 8.1.0.

Filer kommer som standard att lagras i serverns standardkatalog för temporära filer, om inte en annan plats har angivits med direktivet `upload_tmp_dir` i php.ini. Serverns standardkatalog kan ändras genom att ställa in miljövariabeln TMPDIR i den miljö där PHP körs. Att sätta den med `putenv()` inom ett PHP-skript kommer inte att fungera. Denna miljövariabel kan också användas för att säkerställa att andra operationer fungerar på uppladdade filer också.

Exempel #2 Validering av filuppladdningar

Se även funktionerna is_uploaded_file() och move_uploaded_file() för mer information. Följande exempel kommer att behandla filuppladdningen som kom från ett formulär.

<?php
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "Filen är giltig och har laddats upp framgångsrikt.\n";
} else {
    echo "Möjlig filuppladdningsattack!\n";
}

echo 'Här är lite mer felsökningsinformation:';
print_r($_FILES);

print "

";

?>

PHP-skriptet som tar emot den uppladdade filen bör implementera den logik som behövs för att avgöra vad som ska göras med den uppladdade filen. Du kan till exempel använda variabeln `$_FILES['userfile']['size']` för att kasta bort alla filer som är antingen för små eller för stora. Du kan använda variabeln `$_FILES['userfile']['type']` för att kasta bort alla filer som inte matchade ett visst typkriterium, men använd detta endast som första steg i en serie av kontroller, eftersom detta värde är helt under klientens kontroll och inte kontrolleras på PHP-sidan. Du kan också använda `$_FILES['userfile']['error']` och planera din logik enligt felkoderna. Oavsett logik bör du antingen ta bort filen från den temporära katalogen eller flytta den någon annanstans.

Om ingen fil har valts för uppladdning i ditt formulär kommer PHP att returnera `$_FILES['userfile']['size']` som 0 och `$_FILES['userfile']['tmp_name']` som none.

Filen kommer att raderas från den temporära katalogen i slutet av förfrågan om den inte har flyttats eller bytt namn.

Exempel #3 Uppladdning av array av filer

PHP stöder HTML-arrayfunktionen även med filer.

<form action="" method="post" enctype="multipart/form-data">
<p>Bilder:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Skicka" />
</p>
</form>

<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        // basename() kan förhindra angrepp på filsystemet;
        // ytterligare validering/sanering av filnamnet kan vara lämpligt
        $name = basename($_FILES["pictures"]["name"][$key]);
        move_uploaded_file($tmp_name, "data/$name");
    }
}
?>

En uppladdningsförloppsindikator kan implementeras med hjälp av Session Upload Progress.

Sidslut

Orginalhemsidan på Engelska :https://www.php.net/manual/en/security.cgi-bin.default.php

PHP

Funktioner


Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till Datorhjälp.se som har sponsrat Linux.se med webserver.