it-swarm.com.de

Warum ist $ _FILES leer, wenn Dateien nach PHP hochgeladen werden?

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 hochgeladen zu werden. In PHP ist das $_FILES-Array jedoch leer. Im Ordner c:\wamp\tmp befindet sich keine Datei. Ich habe php.ini so konfiguriert, dass Dateiuploads und dergleichen möglich sind. Der Ordner tmp verfügt über Lese- und Schreibrechte für den aktuellen Benutzer. Ich bin verblüfft.

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";
?>
118
elmonty

Vielen Dank an alle für die vielfältigen Antworten. Das ist alles sehr hilfreich. Die Antwort erwies sich als sehr seltsam. Es stellt sich heraus, dass PHP 5.2.11 Folgendes nicht mag:

post_max_size = 2G

oder 

post_max_size = 2048M

Wenn ich es in 2047M ändere, funktioniert der Upload.

14
elmonty

Hier ist eine Checkliste zum Hochladen von Dateien in PHP:

  1. Überprüfen Sie die php.ini auf:
    file_uploads = On
    post_max_size = 100M
    upload_max_filesize = 100M

    • Möglicherweise müssen Sie .htaccess oder .user.ini verwenden, wenn Sie Shared Hosting verwenden und keinen Zugriff auf php.ini haben.
    • Stellen Sie sicher, dass Sie die richtige INI-Datei bearbeiten. Verwenden Sie die Funktion phpinfo(), um zu überprüfen, ob Ihre Einstellungen tatsächlich angewendet werden.
    • Achten Sie auch darauf, dass Sie die Größen nicht falsch schreiben - es sollte 100M sein, nicht 100MB.
  2. Stellen Sie sicher, dass Ihr <form> -Tag das enctype="multipart/form-data" -Attribut hat. Kein anderes Tag wird funktionieren, es muss Ihr FORM-Tag sein. Überprüfen Sie, ob die Schreibweise richtig ist . Stellen Sie sicher, dass Multipart-/Formulardaten von STRAIGHT QUOTES und nicht von Smart Quotes umgeben sind, die aus Word OR aus einem Website-Blog eingefügt wurden (WordPress konvertiert gerade Anführungszeichen in Winkel-Anführungszeichen!). Wenn die Seite mehrere Formulare enthält, stellen Sie sicher, dass beide über dieses Attribut verfügen. Geben Sie sie manuell ein oder versuchen Sie es mit einfachen, manuell eingegebenen Anführungszeichen.

  3. 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:

    <input type="file" name="files[]">
    <input type="file" name="files[]">
    
  4. Stellen Sie sicher, dass in Ihrem tmp- und Upload-Verzeichnis die richtigen Lese- und Schreibberechtigungen festgelegt sind. Der temporäre Upload-Ordner wird in den Einstellungen von PHP als upload_tmp_dir angegeben.

  5. Vergewissern Sie sich, dass in Ihrem Dateiziel und in Ihrem tmp/upload-Verzeichnis keine Leerzeichen enthalten sind.

  6. Stellen Sie sicher, dass alle <form> auf Ihrer Seite </form> Close-Tags haben.

  7. Stellen Sie sicher, dass Ihr FORM-Tag method="POST" enthält. GET-Anforderungen unterstützen keine Uploads von Mehrfach-/Formulardaten.

  8. Stellen Sie sicher, dass Ihr Dateieingabe-Tag ein NAME-Attribut hat. Ein ID-Attribut reicht NICHT aus! ID-Attribute werden im DOM verwendet, nicht für POST Payloads.

  9. Stellen Sie sicher, dass Sie kein Javascript verwenden, um Ihr <input type="file"> -Feld bei der Übermittlung zu deaktivieren

  10. Stellen Sie sicher, dass Sie keine Formulare wie <form><form></form></form> verschachteln.

  11. Überprüfen Sie Ihre HTML-Struktur auf ungültige/überlappende Tags wie <div><form></div></form>

  12. Stellen Sie außerdem sicher, dass die Datei, die Sie hochladen, keine nicht alphanumerischen Zeichen enthält.

  13. 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 .htaccess geändert hatte und einer von ihnen (noch nicht sicher, welcher) verursachte, dass der Upload fehlschlug und $_FILES leer war .

  14. Möglicherweise können Sie versuchen, Unterstriche (_) im name="" -Attribut des <input> -Tags zu vermeiden

  15. Versuchen Sie, sehr kleine Dateien hochzuladen, um einzugrenzen, ob es sich um ein Problem mit der Dateigröße handelt.

  16. Überprüfen Sie den verfügbaren Speicherplatz. Obwohl sehr selten, wird es in diesem PHP Manual page comment ​​erwähnt:

    Wenn das Array $ _FILES plötzlich auf mysteriöse Weise leer wird, obwohl Ihr Formular korrekt zu sein scheint, sollten Sie den verfügbaren Speicherplatz für Ihre temporäre Ordnerpartition überprüfen. In meiner Installation sind alle Dateiuploads ohne Warnung fehlgeschlagen. Nach langem Zähneknirschen habe ich versucht, zusätzlichen Speicherplatz freizugeben. Danach funktionierten die Datei-Uploads plötzlich wieder.

  17. 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, warum meine Variable $ _FILES leer war, darin bestand, dass ich das Formular mit einem AJAX POSTabschickte. _ Anfrage. Ich weiß, dass es auch Methoden gibt, um Dateien mit Ajax hochzuladen, aber dies könnte ein gültiger Grund sein, warum Ihr Array $ _FILES leer ist.

Quelle für einige dieser Punkte:
http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/

437
shamittomar

Was den HTML-Code angeht, scheinen Sie diesen Teil richtig eingerichtet zu haben. Sie haben bereits den enctype="multipart/form-data", der für das Formular sehr wichtig ist.

Bis zu Ihrem php.ini-Setup sind auf Systemen manchmal mehrere php.ini-Dateien vorhanden. Stellen Sie sicher, dass Sie das richtige bearbeiten. Ich weiß, Sie sagten, Sie hätten Ihre php.ini-Datei für das Hochladen von Dateien konfiguriert, aber haben Sie auch festgelegt, dass upload_max_filesize und post_max_size größer sind als die Datei, die Sie hochladen möchten? Sie sollten also haben:

file_uploads = On; sounds like you already did this
post_max_size = 8M; change this higher if needed
upload_max_filesize = 8M; change this higher if needed

Hat Ihr Verzeichnis: "c:\wamp\tmp" sowohl Lese- als auch Schreibrechte? Haben Sie daran gedacht, Apache neu zu starten, nachdem Sie die php.ini-Änderungen vorgenommen haben?


67
Brian

Es ist wichtig, Ihrem Formular enctype="multipart/form-data" hinzuzufügen, Beispiel

<form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>
28
meda

Hier eine andere 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 data-ajax also auf false.

5
dutchman711

Ich habe ein Problem, wenn ich 2 Stunden suche. Es ist sehr einfach, zuerst unsere Serverkonfiguration zu überprüfen. 

Beispiel:

echo $upload_max_size = ini_get('upload_max_filesize');  
echo $post_max_size=ini_get('post_max_size');   

jede Art von Dateigröße ist :20mb, aber unser upload_max_size steht über 20mb, aber das Array ist null. Antwort ist unser post_max_size sollte größer sein als upload_max_filesize

post_max_size = 750M  
upload_max_filesize = 750M
5
shashik493

Ich kämpfte mit dem gleichen Problem und testete alles, bekam keine Fehlermeldung und nichts schien falsch zu sein ... Ich hatte error_reporting (E_ALL). Aber plötzlich wurde mir klar, dass ich das Apache-Protokoll und die voilà nicht überprüft hatte. Es gab einen Syntaxfehler im Skript ...! (ein fehlendes "}")

Auch wenn dies offensichtlich ist, um es zu überprüfen, kann es vergessen werden ... In meinem Fall (Linux) liegt es an:

/var/log/Apache2/error.log
3
Luis Rosety

Stellen Sie sicher, dass Ihr Eingabeelement ein Attribut 'name' hat .<input type="file" name="uploadedfile" />

Wenn dies fehlt, ist $ _FILES leer.

3
Adrian Parr

Ein weiterer möglicher Täter ist Apache-Weiterleitungen. In meinem Fall hatte ich die httpd.conf von Apache so eingerichtet, dass bestimmte Seiten unserer Website zu http-Versionen und andere Seiten zu https-Versionen der Seite umgeleitet werden, 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 als Aktion des Formulars bestimmte Seite wurde als http konfiguriert. Die Seite übermittelte also den Upload an die SSL-Version der Aktionsseite, aber Apache leitete ihn auf die HTTP-Version der Seite um, und die Post-Daten einschließlich der hochgeladenen Datei gingen verloren.

2
user2723315

Wenn Sie versuchen, ein Array von Dateien hochzuladen, müssen Sie möglicherweise max_file_uploads in php.ini erhöhen. Dies ist standardmäßig auf 20 eingestellt.

Note: max_file_uploads kann außerhalb der php.ini NICHT geändert werden. Siehe PHP "Bug" # 50684

2
Tahir Yasin

Überprüfen Sie Ihre php.ini auf enable_post_data_reading = On, weil:

Durch Deaktivieren dieser Option werden $ _POST und $ _FILES nicht aufgefüllt. Die einzige Möglichkeit, Postdaten zu lesen, ist dann der Eingabedaten-Wrapper von php: //. (...)

In http://php.net/manual/de/ini.core.php#ini.enable-post-data-reading

2
jmng

Niemand hat das erwähnt, aber es hat mir geholfen, und nicht viele Orte im Netz erwähnen es.

Stellen Sie sicher, dass Ihre php.ini den folgenden Schlüssel setzt:

    upload_tmp_dir="/path/to/some/tmp/folder"

Sie müssen mit Ihrem Webhost überprüfen, ob Sie einen absoluten Server-Dateipfad verwenden möchten. Sie sollten in der Lage sein, andere Verzeichnisbeispiele in Ihrer php.ini-Datei zu sehen, um dies festzustellen. Sobald ich es gesetzt habe, habe ich Werte in meinem _FILES-Objekt erhalten.

Stellen Sie schließlich sicher, dass Ihr tmp-Ordner und wohin Sie Dateien verschieben, um die richtigen Berechtigungen zu haben, damit sie gelesen und geschrieben werden können.

2
AaronP

Ich stieß auf das gleiche Problem und stellte fest, dass es sich um meine IDE handelte, die Teil des Problems war. Ich habe den Debugger direkt vom IDE (PHPStorm) aus gestartet, anstatt nur den Browser direkt zu verwenden. Die von IDE erstellte URL sah folgendermaßen aus:

"...localhost:63342/CB_Upload/index.php?_ijt=j2hcbacqepj87bvg66ncuohvne"

und nur mit:

"...localhost/CB_Upload/index.php"

hat gut funktioniert. Mein Setup ist PC/Windows 10/WAMPSERVER 3.0.6 64bit 

1
Marc M.

Vertrauen Sie nicht dem von sys_get_temp_dir angegebenen Speicherort für temporäre Ordner, 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 hat, /tmp war. Dieser Glaube wurde durch die Tatsache bekräftigt, dass echo sys_get_temp_dir() . PHP_EOL; einen /tmp zurückgibt. Außerdem gibt echo ini_get('upload_tmp_dir'); nichts zurück.

Um zu überprüfen, ob die hochgeladene Datei tatsächlich kurz in meinem Ordner /tmp angezeigt wird, habe ich meinem Skript eine sleep(30); -Anweisung hinzugefügt (wie empfohlen hier ) und zu meinem Ordner /tmp im cPanel-Dateimanager navigiert um die Datei zu finden. Unabhängig davon war die hochgeladene Datei jedoch nirgends zu finden.

Ich habe stundenlang versucht, den Grund dafür zu ermitteln, und alle Vorschläge umgesetzt, die hier angeboten wurden.

Nachdem ich meine Website-Dateien nach der Abfrage tmp durchsucht hatte, stellte ich fest, dass meine Site andere Ordner mit dem Namen tmp in verschiedenen Verzeichnissen enthielt. Ich stellte fest, dass mein PHP Skript tatsächlich die hochgeladenen Dateien in .cagefs/tmp schrieb. (The "Show Die Einstellung "Versteckte Dateien" muss in cPanel aktiviert sein, damit dieser Ordner angezeigt werden kann.)

Warum gibt die Funktion sys_get_temp_dir ungenaue Informationen zurück?

Hier ist eine Erklärung von der PHP.net-Webseite für sys_get_temp_dir (d. H. Den obersten Kommentar):

Wenn Sie auf einem Linux-System mit systemd PrivateTmp = true ausführen (dies ist die Standardeinstellung für CentOS 7 und möglicherweise für andere neuere Distributionen), gibt diese Funktion einfach "/ tmp" zurück, nicht den true-Pfad, sondern einen viel längeren, etwas dynamischen Pfad.

Dieser SO Beitrag befasst sich auch mit dem Problem:

1
Crickets

Ich hatte ein ähnliches Problem und das Problem hatte einen falschen Wert in htaccess, wie Shamittomar erwähnte.

php_value post_max_size 10MB in php_value post_max_size 10M ändern

0
Johnny Vietnam

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.

<form action="upload.php" method="post" enctype="multipart/form-data"  data-ajax="false">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>
0
Rajan

Ich war $_FILES leer, weil ich nach <form enctype="multipart/form-data" method="post"> gestellt habe 

</div>
<div style="clear:both"></div>

Anfangscode war wie 

<span class="span_left">Photos (gif/jpg/jpeg/png) </span>
<form enctype="multipart/form-data" method="post">
<input name="files[]" type="file" id="upload_file" />
<input type="button" id="upload" value="Upload photo" />
</form>

Ich entschied mich zu ändern und 

<div>
<span class="span_left">Photos (gif/jpg/jpeg/png) </span>
<form enctype="multipart/form-data" method="post">
</div>
<div style="clear:both"></div>
<input name="files[]" type="file" id="upload_file" />
<input type="button" id="upload" value="Upload photo" />
</form>
<div style="clear:both"></div>

Schlussfolgerung ist also, dass nach <form enctype="multipart/form-data" method="post"><input name, type, id sein muss und nicht <div> oder einige andere Tags sein darf

In meiner Situation war der richtige Code 

<div>
<span class="span_left">Photos (gif/jpg/jpeg/png) </span>
</div>
<div style="clear:both"></div>
<form enctype="multipart/form-data" method="post">
<input name="files[]" type="file" id="upload_file" />
<input type="button" id="upload" value="Upload photo" />
</form>
<div style="clear:both"></div>
0
Andris

Ich habe das gleiche Problem und kein Thema war mein Fehler. Überprüfen Sie in Ihrer .htaccess-Datei, ob Sie eine haben, ob "MultiViews" aktiviert ist. Ich musste sie deaktivieren.

0
Murolack

Wenn Ihr Hauptskript http://Some_long_URL/index.php ist, geben Sie bitte die vollständige URL (mit explizitem index.php und nicht nur http://Some_long_URL) im Feld action an. Überraschenderweise wird, wenn nicht, das richtige Skript ausgeführt, jedoch mit leerem $ _FILES!

0
Gibbie

Ich hatte auch Probleme mit $ _FILES empty. In der obigen Checkliste werden MultiViews in .htaccess, httpd.conf oder httpd-vhost.conf nicht erwähnt.

Wenn Sie in der options-Direktive MultiViews für Ihr Verzeichnis mit der Website festgelegt haben, ist $ _FILES leer, auch wenn der Header Content-Length angezeigt wird, wenn die hochgeladene Datei angezeigt wird.

0
gerteb