Datei upload bringt 500er
Paul
- php
Moin,
mit folgenden sripten versuche ich eine Datei hochzuladen:
<html>
<body>
<form action="upload.php" method="get"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
und upload.php
<?php
if ($_FILES["file"]["error"] > 0) {
echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else {
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
}
?>
Leider kommt sofort ein 500er vom Server. Wenn ich alles in Kommentare setze und nur $_FILES per print_r ausgebe, kommt ein leeres array. Sobald ich es mit $_FILES["file"] oder so versuche kommt der 500er. Habe ich PHP falsch eingerichtet?
Danke,
Paul
in der php.ini steht u.a.:
file_uploads = On
Die Größe der Datei ist auch nicht das Problem.
moin,
<form action="upload.php" method="get"
enctype="multipart/form-data">
enctype="multipart/form-data" funktioniert nur mit method="POST"
Horst
Moin Horst,
danke Dir.
Nun hab ich das Problem evtl. eingegrenzt. Wenn ich die post-Variable file im php-script auslesen will (echo $_POST['file'];) kommt der 500er auch. Liegt also wohl nicht am upload sondern an der Übertragung der Variablen?
Paul
OK, zurück: wenn ich multipart/form-data rausnehme funktioniert die Übertragung der Variablen. Sorry.
Es war ein Zuriffsfehler.
Musste den upload_tmp_dir in der php.ini auf einen Ordner legen, auf dem Schreibrechte für den Benutzer vorhanden sind. Der Standard Ordner (welcher das auch immer ist) hat wohl keine gehabt.
Paul
Es war ein Zuriffsfehler.
Ahh, guckst Du Log ;)
Nochmal zum enctype="multipart/form-data":
Ich denke, jeder Programmierer sollte wissen was da eigentlich passiert, was da am Server ankommt und dass das, was da ankommt aus STDIN gelesen wird, Letzeres ist charakteristisch für method="POST": So siehts aus.
Interessant ist auch das neue JS-Objekt FormData und die Möglichkeit, einen Upload per JS zu machen.
Hello,
Musste den upload_tmp_dir in der php.ini auf einen Ordner legen, auf dem Schreibrechte für den Benutzer vorhanden sind. Der Standard Ordner (welcher das auch immer ist) hat wohl keine gehabt.
Oh jemineh!
Hast Du Zugriff zur Server- bzw. Virt-Host-Konfiguration?
Das upload\_tmp\_dir
sollte unbedingt AUSSERHALB der Document Root liegen.
Mittels open\_basedir
kann man dem Account darauf Zugriff gewähren (PHP als Modul).
Bei CGI- oder FastCGI-Einrichtung muss dies über das Rechtesystem geschehen.
Wichtig ist aber, das kein anderer Account ('Domain') auf diese Verzeichnisse Zugriff hat.
Der Code
#### falsch ####
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
}
ist so nicht in Ordnung.
Bei einem Single-File-Upload könnte es heißen:
#### besser ####
if ($_FILES["file"]["error"] === 0)
{
echo "<p>Upload: " . htmlspecialchars($_FILES["file"]["name"]) . "</p>";
}
else
{
echo "<p>Error: " . htmlspecialchars($_FILES["file"]["error"]) . "</p>";
}
Das ist darin begründet, dass bei einem Multi-File-Upload ein Array in ["error"] steht.
$_FILES["file"]["error"][$n]
Lies Dir bitte den angefangenen Artikel im Wiki zum File-Upload durch:
http://wiki.selfhtml.org/wiki/Artikel:PHP/File_Upload
Da findest Du noch etliche Fallstricke zum Thema!
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg