Ich habe WampServer 2 auf meinem Windows 7-Computer installiert. Ich verwende Apache 2.2.11 und PHP 5.2.11. Wenn ich versuche, eine Datei aus einem Formular hochzuladen, scheint sie hochzuladen, aber in PHP ist das $_FILES
Array leer. Der c:\wamp\tmp
Ordner enthält keine Datei . Ich habe konfiguriert php.ini
, um das Hochladen von Dateien und dergleichen zuzulassen. Der tmp
Ordner verfügt über Lese- / Schreibrechte für den aktuellen Benutzer. Ich bin ratlos.
HTML:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form enctype="multipart/form-data" action="vanilla-upload.php" method="POST">
Choose a file to upload: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>
PHP:
<?php
echo 'file count=', count($_FILES),"\n";
var_dump($_FILES);
echo "\n";
?>
php
apache
file-upload
Elmonty
quelle
quelle
vanilla-upload.php
?Antworten:
Hier ist eine Checkliste für das Hochladen von Dateien in PHP:
Überprüfen Sie php.ini für:
file_uploads = On
post_max_size = 100M
upload_max_filesize = 100M
.htaccess
oder.user.ini
wenn Sie auf Shared Hosting sind und keinen Zugriff darauf habenphp.ini
.phpinfo()
Funktion, um zu überprüfen, ob Ihre Einstellungen tatsächlich angewendet werden.100M
nicht der Fall sein100MB
.Stellen Sie sicher, dass Ihr
<form>
Tag dasenctype="multipart/form-data"
Attribut hat. Kein anderes Tag funktioniert, es muss Ihr FORM-Tag sein. Stellen Sie sicher, dass die Schreibweise korrekt ist . Stellen Sie sicher, dass mehrteilige / Formulardaten von GERADEN ANGEBOTEN umgeben sind, nicht von intelligenten Anführungszeichen, die aus Word oder einem Website-Blog eingefügt wurden (WordPress konvertiert gerade Anführungszeichen in Anführungszeichen!). Wenn Sie mehrere Formulare auf der Seite haben, stellen Sie sicher, dass beide dieses Attribut haben. Geben Sie sie manuell ein oder versuchen Sie es mit einfachen einfachen Anführungszeichen, die manuell eingegeben werden.Stellen Sie sicher, dass Sie nicht zwei Eingabedateifelder mit demselben
name
Attribut haben. Wenn Sie mehrere unterstützen müssen, setzen Sie eckige Klammern am Ende des Namens:Stellen Sie sicher, dass für Ihre tmp- und Upload-Verzeichnisse die richtigen Lese- und Schreibberechtigungen festgelegt sind. Der temporäre Upload-Ordner wird in den PHP-Einstellungen als angegeben
upload_tmp_dir
.Stellen Sie sicher, dass Ihr Dateiziel und Ihre tmp / upload-Verzeichnisse keine Leerzeichen enthalten.
Stellen Sie sicher, dass alle
<form>
auf Ihrer Seite</form>
enge Tags haben.Stellen Sie sicher, dass Ihr FORM-Tag hat
method="POST"
. GET-Anforderungen unterstützen keine Uploads von Mehrteil- / Formulardaten.Stellen Sie sicher, dass Ihr Dateieingabe-Tag ein NAME-Attribut hat. Ein ID-Attribut ist NICHT ausreichend! ID-Attribute werden im DOM verwendet, nicht für POST-Nutzdaten.
Stellen Sie sicher, dass Sie kein Javascript verwenden, um Ihr
<input type="file">
Feld bei der Übermittlung zu deaktivierenStellen Sie sicher, dass Sie keine Formulare wie verschachteln
<form><form></form></form>
Überprüfen Sie Ihre HTML-Struktur auf ungültige / überlappende Tags wie
<div><form></div></form>
Stellen Sie außerdem sicher, dass die Datei, die Sie hochladen, keine nicht alphanumerischen Zeichen enthält.
Einmal habe ich nur stundenlang versucht herauszufinden, warum mir das plötzlich passiert ist. Es stellte sich heraus, dass ich einige der PHP-Einstellungen in geändert
.htaccess
hatte und eine davon (noch nicht sicher, welche) dazu führte, dass der Upload fehlschlug und$_FILES
leer war.Sie könnten möglicherweise versuchen, Unterstriche (
_
) imname=""
Attribut des<input>
Tags zu vermeidenVersuchen Sie, sehr kleine Dateien hochzuladen, um einzugrenzen, ob es sich um ein Problem mit der Dateigröße handelt.
Überprüfen Sie Ihren verfügbaren Speicherplatz. Obwohl sehr selten, wird es in diesem PHP-Handbuch Seite Kommentar erwähnt :
Stellen Sie sicher, dass Sie das Formular nicht über eine AJAX-POST-Anforderung senden, sondern über eine normale POST-Anforderung, bei der eine Seite neu geladen wird. Ich ging jeden Punkt in der obigen Liste durch und fand schließlich heraus, dass der Grund, aus dem meine Variable $ _FILES leer war, darin bestand, dass ich das Formular mit einer AJAX POST-Anfrage abschickte. Ich weiß, dass es Methoden gibt, um Dateien auch mit Ajax hochzuladen, aber dies könnte ein gültiger Grund sein, warum Ihr $ _FILES-Array leer ist.
Quelle für einige dieser Punkte:
http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/
quelle
<form><form><input type="file"></form></form>
$('#my-form')[0].reset();
den Submit-Handler angerufen .In Bezug auf den HTML-Code scheinen Sie diesen Teil korrekt eingerichtet zu haben. Sie haben bereits das,
enctype="multipart/form-data"
was auf dem Formular sehr wichtig ist.In Bezug auf Ihr
php.ini
Setup sind auf Systemen manchmal mehrerephp.ini
Dateien vorhanden. Stellen Sie sicher, dass Sie die richtige bearbeiten. Ich weiß , Sie sagen , Sie Ihre konfiguriertenphp.ini
Datei - Datei - Uploads, haben , aber haben Sie auch Ihre gesetztupload_max_filesize
undpost_max_size
größer zu sein als die Datei , die Sie laden wollen? Sie sollten also haben:Verfügt Ihr Verzeichnis
"c:\wamp\tmp"
über Lese- und Schreibberechtigungen? Haben Sie daran gedacht, Apache neu zu starten, nachdem Sie diephp.ini
Änderungen vorgenommen haben?quelle
Es ist wichtig
enctype="multipart/form-data"
, Ihrem Formular ein Beispiel hinzuzufügenquelle
Vielen Dank an alle für die unterschiedlich umfassenden Antworten. Das sind alle sehr hilfreich. Die Antwort stellte sich als etwas sehr Seltsames heraus. Es stellt sich heraus, dass PHP 5.2.11 Folgendes nicht mag:
oder
Wenn ich es ändere
2047M
, funktioniert der Upload.quelle
Ich habe das gleiche Problem 2 Stunden suchen, ist sehr einfach, wir überprüfen zuerst unsere Serverkonfiguration.
Beispiel:
Jede Art von Dateigröße ist
:20mb
, aber unsereupload_max_size
ist oben,20mb
aber Array istnull
. Die Antwort ist, dass unserepost_max_size
größer sein sollte alsupload_max_filesize
quelle
Hier eine weitere Ursache, die ich gefunden habe: Wenn Sie JQuery Mobile verwenden und das Formularattribut data-ajax auf true gesetzt ist, ist das FILES-Array leer. Setzen Sie also data-ajax auf false.
quelle
Stellen Sie sicher, dass Ihr Eingabeelement ein Attribut 'name' hat.
<input type="file" name="uploadedfile" />
Wenn dies fehlt, sind die $ _FILES leer.
quelle
Ich hatte mit dem gleichen Problem zu kämpfen und alles zu testen, keine Fehlerberichterstattung zu erhalten und nichts schien falsch zu sein. Ich hatte error_reporting (E_ALL) Aber plötzlich wurde mir klar, dass ich das Apache-Protokoll und voilà nicht überprüft hatte! Es gab einen Syntaxfehler im Skript ...! (ein fehlendes "}")
Obwohl dies offensichtlich überprüft werden muss, kann es vergessen werden ... In meinem Fall (Linux) ist es bei:
quelle
Niemand erwähnte dies, aber es half mir und nicht viele Stellen im Netz erwähnen es.
Stellen Sie sicher, dass Ihre php.ini den folgenden Schlüssel setzt:
Sie müssen sich bei Ihrem Webhost erkundigen, ob Sie einen absoluten Server-Dateipfad verwenden sollen. Sie sollten in der Lage sein, andere Verzeichnisbeispiele in Ihrer php.ini-Datei zu sehen, um dies festzustellen. Sobald ich es eingestellt habe, habe ich Werte in meinem _FILES-Objekt.
Stellen Sie schließlich sicher, dass Ihr tmp-Ordner und überall dort, wo Sie Dateien verschieben, die richtigen Berechtigungen haben, damit sie gelesen und beschrieben werden können.
quelle
Wenn Sie eine Reihe von Dateien hochladen möchten , dann müssen Sie unter Umständen erhöhen
max_file_uploads
inphp.ini
dem standardmäßig eingestellt ist20
Hinweis :
max_file_uploads
kann NICHT außerhalb von php.ini geändert werden. Siehe PHP "Bug" # 50684quelle
Ein weiterer möglicher Schuldiger sind Apache-Weiterleitungen. In meinem Fall hatte ich die httpd.conf von Apache eingerichtet, um bestimmte Seiten unserer Website auf http-Versionen und andere Seiten auf https-Versionen der Seite umzuleiten, sofern dies nicht bereits geschehen war. Die Seite, auf der ich ein Formular mit einer Dateieingabe hatte, war eine der Seiten, die zum Erzwingen von SSL konfiguriert waren, aber die Seite, die als Aktion des Formulars festgelegt wurde, wurde als http konfiguriert. Die Seite übermittelte den Upload also an die SSL-Version der Aktionsseite, aber Apache leitete ihn an die http-Version der Seite weiter, und die Post-Daten, einschließlich der hochgeladenen Datei, gingen verloren.
quelle
Überprüfen Sie Ihre php.ini auf enable_post_data_reading = On , weil:
In http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading
quelle
Wenn Ihr Hauptskript
http://Some_long_URL/index.php
sorgfältig ist, geben Sie die vollständige URL (explizitindex.php
und nicht nurhttp://Some_long_URL
) in dasaction
Feld ein. Wenn nicht, wird überraschenderweise das richtige Skript ausgeführt, jedoch mit en leeren $ _FILES!quelle
Ich bin auf dasselbe Problem gestoßen und habe festgestellt, dass meine IDE Teil des Problems war. Ich habe den Debugger direkt von der IDE (PHPStorm) aus gestartet, anstatt nur den Browser direkt zu verwenden. Die von der IDE erzeugte URL lautete wie folgt:
und nur mit:
hat gut funktioniert. Mein Setup ist PC / Windows 10 / WAMPSERVER 3.0.6 64bit
quelle
Vertrauen Sie nicht dem Speicherort des temporären Ordners, der von angegeben wird,
sys_get_temp_dir
wenn Sie sich in einer gemeinsam genutzten Hosting-Umgebung befinden.Hier ist noch eine Sache zu überprüfen, die noch nicht erwähnt wurde ...
Ich nahm natürlich an, dass der Ordner, in dem mein PHP-Skript temporäre Datei-Uploads gespeichert hatte, war
/tmp
. Dieser Glaube wurde durch die Tatsache verstärkt, dassecho sys_get_temp_dir() . PHP_EOL;
zurückkehrt/tmp
. Auchecho ini_get('upload_tmp_dir');
gibt nichts zurück.Um zu überprüfen, ob die hochgeladene Datei tatsächlich kurz in meinem
/tmp
Ordner angezeigt wird, habe ichsleep(30);
meinem Skript eine Anweisung hinzugefügt (wie hier vorgeschlagen ) und/tmp
im cPanel-Dateimanager zu meinem Ordner navigiert , um die Datei zu suchen. Unabhängig davon war die hochgeladene Datei dort nirgends zu finden.Ich habe stundenlang versucht, den Grund dafür zu ermitteln, und jeden hier angebotenen Vorschlag umgesetzt.
Nachdem ich meine Website-Dateien nach der Abfrage durchsucht hatte
tmp
, stellte ich schließlich fest, dass meine Website andere Ordner enthielt, dietmp
in verschiedenen Verzeichnissen benannt waren. Ich stellte fest, dass mein PHP-Skript tatsächlich die hochgeladenen Dateien in schrieb.cagefs/tmp
. (Die Einstellung "Versteckte Dateien anzeigen " muss in cPanel aktiviert sein, damit dieser Ordner angezeigt werden kann.)Warum gibt die
sys_get_temp_dir
Funktion ungenaue Informationen zurück?Hier ist eine Erklärung von der PHP.net-Webseite für
sys_get_temp_dir
(dh den obersten Kommentar):Dieser SO-Beitrag befasst sich auch mit dem Thema:
quelle
Ich habe das gleiche Problem und keines der Themen war mein Fehler. Checken Sie in Ihrer .htaccess-Datei ein, falls Sie eine haben, und aktivieren Sie "MultiViews". Ich musste sie deaktivieren.
quelle
Ich hatte ein ähnliches Problem und das Problem hatte im htaccess einen falschen Wert, wie Shamittomar erwähnte.
Wechseln Sie
php_value post_max_size 10MB
zuphp_value post_max_size 10M
quelle
Ich war leer,
$_FILES
weil nach dem<form enctype="multipart/form-data" method="post">
PlatzierenDer ursprüngliche Code war wie
Ich entschied mich zu modifizieren und
Die Schlussfolgerung ist also, dass nach
<form enctype="multipart/form-data" method="post">
muss<input name, type, id
und darf nicht<div>
oder einige andere Tags seinIn meiner Situation war der richtige Code
quelle
Ich hatte auch Probleme mit $ _FILES leer. In der obigen Checkliste werden MultiViews in .htaccess, httpd.conf oder httpd-vhost.conf nicht erwähnt.
Wenn Sie MultiViews in der Optionsanweisung für Ihr Verzeichnis mit der Website festgelegt haben, ist $ _FILES leer, obwohl der Header "Content-Length" angezeigt wird, wenn die von mir hochgeladene Datei angezeigt wird.
quelle
Wenn Sie JQuery Mobile verwenden
Die Verwendung eines mehrteiligen Formulars mit einer Dateieingabe wird von Ajax nicht unterstützt. In diesem Fall sollten Sie das übergeordnete Formular mit data-ajax = "false" dekorieren, um sicherzustellen, dass das Formular ordnungsgemäß an den Server gesendet wird.
quelle
Trennen Sie Ihr Formular von der Seite, die Sie verwenden, in eine einfache PHP-Seite, die nur das Formular und den PHP-Code enthält, und testen Sie es so.
Jedes Bootstrap- oder Java-Skript kann die _FILES [] bereinigen. Das war mein Fall
quelle