Dlaczego $ FILES ma być puste podczas przesyłania plików do PHP?

Mam WampServer 2 zainstalowany na moim komputerze z systemem Windows 7. Używam Apache 2.2.11 i PHP 5.2.11. Kiedy próbuję przesłać dowolny plik z formularza, wydaje się, że wysyła, ale w PHP tablica $_FILES jest pusta. W folderze c:\wamp\tmp nie ma pliku. Skonfigurowałem php.ini, aby umożliwić przesyłanie plików i tym podobne. Folder tmp posiada uprawnienia do odczytu/zapisu dla bieżącego użytkownika. Jestem zakłopotany.

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";
?>
Author: Nikola K., 2010-08-27

20 answers

Oto lista kontrolna do przesyłania plików w PHP:

  1. Sprawdź php.ini dla:
    file_uploads = On
    post_max_size = 100M
    upload_max_filesize = 100M

      Jeśli korzystasz z hostingu współdzielonego i nie masz dostępu do hostingu współdzielonego, może być konieczne użycie .htaccess lub .user.ini.
  2. upewnij się edytujesz poprawny plik ini – użyj funkcji phpinfo(), aby zweryfikować swoje ustawienia są faktycznie stosowane.
  3. również upewnij się, że nie źle Przelicz rozmiary-powinno być 100M nie 100MB.
  4. Upewnij się, że twój znacznik <form> ma atrybut enctype="multipart/form-data". Żaden inny znacznik nie będzie działał, musi to być twój znacznik formularza. Sprawdź, czy jest napisane poprawnie . Sprawdź dokładnie, czy dane wieloczęściowe / formularze są otoczone cytatami prostymi, a nie inteligentnymi cytatami wklejonymi z Worda lub z bloga internetowego (WordPress konwertuje cytaty proste na cytaty kątowe!). Jeśli na stronie znajduje się wiele formularzy, upewnij się, że oba mają ten atrybut. Wpisz je ręcznie lub spróbuj proste pojedyncze cytaty wpisywane ręcznie.

  5. Upewnij się, że nie masz dwóch pól pliku wejściowego z tym samym atrybutem name. Jeśli chcesz obsługiwać wiele, umieść nawiasy kwadratowe na końcu nazwy:

    <input type="file" name="files[]">
    <input type="file" name="files[]">
    
  6. Upewnij się, że katalogi tmp I upload mają ustawione poprawne uprawnienia do odczytu i zapisu. Tymczasowy folder przesyłania jest określony w Ustawieniach PHP jako upload_tmp_dir.

  7. Upewnij się, że katalog docelowy pliku i katalogi tmp/upload nie nie mają w sobie spacje.

  8. Upewnij się, że wszystkie <form> na twojej stronie mają </form> Zamknij tagi.

  9. Upewnij się, że Twój znacznik formularza ma method="POST". Żądania pobierania nie obsługują przesyłania danych wieloczęściowych/formularzy.

  10. Upewnij się, że znacznik wprowadzania Pliku ma atrybut NAME. Atrybut ID nie jest wystarczający! Atrybuty ID są przeznaczone do użycia w DOM, a nie dla obciążeń POST.

  11. Upewnij się, że nie używasz Javascript, aby wyłączyć swoje pole <input type="file"> na submission

  12. Upewnij się, że nie zagnieżdżasz form takich jak <form><form></form></form>

  13. Sprawdź strukturę HTML pod kątem nieprawidłowych / nakładających się znaczników, takich jak <div><form></div></form>

  14. Upewnij się również, że przesyłany plik nie zawiera żadnych znaków niealfanumerycznych.

  15. Raz spędziłem godziny próbując dowiedzieć się, dlaczego tak nagle mi się to przytrafiło. Okazało się, że zmodyfikowałem niektóre ustawienia PHP w .htaccess, a jedno z nich (jeszcze nie wiem, który) powodował, że upload nie powiódł się i $_FILES był pusty.

  16. Możesz spróbować uniknąć podkreślenia (_) w atrybucie name="" znacznika <input>

  17. Spróbuj przesłać bardzo małe pliki, aby zawęzić Rozmiar pliku.

  18. Sprawdź dostępne miejsce na dysku. Chociaż jest bardzo rzadki, jest wymieniony w tym komentarzu strony podręcznika PHP:

    Jeśli tablica $_files nagle zniknie tajemniczo pusty, mimo że formularz wydaje się poprawny, powinieneś sprawdzić miejsce na dysku dostępne dla tymczasowej partycji folderu. W mojej instalacji wszystkie przesłane pliki nie powiodły się bez ostrzeżenia. Po wielu zgrzytaniu zębami próbowałem zwolnić dodatkową przestrzeń, po czym przesyłanie plików nagle działało ponownie.

źródło dla niektórych z nich points:
http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/

 399
Author: shamittomar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-04 05:14:36

Jeśli wydaje się, że HTML poprawnie skonfigurował tę część. Masz już enctype="multipart/form-data", który jest bardzo ważny, aby mieć na formularzu.

Jeśli chodzi o konfigurację php.ini, czasami na systemach istnieje wiele plików php.ini. Upewnij się, że edytujesz poprawny. Wiem, że powiedziałeś, że skonfigurowałeś swój plik php.ini tak, aby wysyłał pliki, ale czy Ustawiłeś również upload_max_filesize i post_max_size, aby były większe niż plik, który próbujesz przesłać? Więc powinieneś mieć:

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

Czy twój katalog: "c:\wamp\tmp" czy masz prawa odczytu i zapisu? Czy pamiętałeś o ponownym uruchomieniu Apache ' a po wprowadzeniu php.ini zmian?


 63
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-01 20:50:06

Ważne jest, aby dodać enctype="multipart/form-data" do formularza, przykład

<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>
 27
Author: meda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-28 03:41:33

Dziękuję wszystkim za wyczerpujące odpowiedzi. To wszystko jest bardzo pomocne. Odpowiedź okazała się czymś bardzo dziwnym. Okazuje się, że PHP 5.2.11 nie lubi:

post_max_size = 2G

Lub

post_max_size = 2048M

Jeśli zmienię na 2047M, upload działa.

 14
Author: elmonty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-08 20:18:23

Upewnij się, że twój form ma następujący atrybut enctype="multipart/form-data".

 8
Author: Johann Burgess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-30 12:21:24

Tutaj kolejna przyczyna, którą znalazłem: Gdy używasz jQuery Mobile i atrybut formularza data-ajax jest ustawiony na true, tablica plików będzie pusta. Więc ustaw data-ajax na false.

 4
Author: dutchman711,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-15 10:59:23

Upewnij się, że element wejściowy ma atrybut 'name'. <input type="file" name="uploadedfile" />

Jeśli tego brakuje, $_FILES będzie puste.

 3
Author: Adrian Parr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-18 15:52:39

Mam ten sam problem patrząc 2 godziny, jest bardzo proste, aby sprawdzić naszą konfigurację serwera najpierw.

Przykład:

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

Każdy typ rozmiaru pliku to :20mb, ale nasza upload_max_size jest powyżej 20mb, ale tablica to null. Odpowiedź jest nasza post_max_size powinna być większa niż upload_max_filesize

post_max_size = 750M  
upload_max_filesize = 750M
 3
Author: shashik493,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-03 04:51:51

Zmagałem się z tym samym problemem i testowałem wszystko, nie otrzymywałem raportów o błędach i nic nie wydawało się być złe. Miałem error_reporting (E_ALL) Ale nagle zdałem sobie sprawę, że nie sprawdziłem dziennika apache i voila! Wystąpił błąd składni w skrypcie...! (brakujące"}")

Więc, nawet jeśli jest to coś oczywistego do sprawdzenia, można o tym zapomnieć... W moim przypadku (linux) jest to:

/var/log/apache2/error.log
 3
Author: Luis Rosety,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-16 06:41:28

Jeśli próbujesz przesłać tablicę plików, może być konieczne zwiększenie max_file_uploads W php.ini, który jest domyślnie ustawiony na 20

Uwaga: max_file_uploads nie można zmienić poza php.ini. Zobacz PHP "błąd" #50684

 2
Author: Tahir Yasin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-15 12:30:06

Innym możliwym winowajcą są przekierowania apache. W moim przypadku miałem httpd apache.conf skonfigurowany do przekierowywania niektórych stron w naszej witrynie do wersji http, a innych stron do wersji https strony, jeśli jeszcze nie były. Strona, na której miałem formularz z wejściem pliku, była jedną ze stron skonfigurowanych do wymuszania ssl, ale strona oznaczona jako działanie formularza została skonfigurowana do http. Więc strona prześle upload do wersji ssl strony akcji, ale apache był przekierowanie go do wersji http strony i dane postu, w tym przesłany plik, zostały utracone.

 2
Author: user2723315,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-27 22:15:35

Nikt o tym nie wspominał, ale to mi pomogło i niewiele miejsc w sieci o tym wspomina.

Upewnij się, że php.ini ustawia następujący klucz:

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

Musisz sprawdzić za pomocą swojego hosta, jeśli chcesz użyć bezwzględnej ścieżki pliku serwera. Powinieneś być w stanie zobaczyć inne przykłady katalogów w Twoim php.plik ini do ustalenia tego. Jak tylko go ustawiłem, otrzymałem wartości w moim obiekcie _FILES.

Na koniec upewnij się, że twój folder tmp i gdziekolwiek przenosisz pliki do mają odpowiednie uprawnienia, aby mogły być odczytywane i zapisywane.

 2
Author: AaronP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-08 21:45:32

Natknąłem się na ten sam problem i stwierdziłem, że to moje IDE było częścią problemu. Uruchamiałem debugger bezpośrednio z IDE (PHPStorm) zamiast używać bezpośrednio przeglądarki. Adres URL generowany przez IDE wyglądał następująco:

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

I wystarczy użyć:

"...localhost/CB_Upload/index.php"
Zadziałało dobrze. Moja konfiguracja to PC / Windows 10 / Wampserver 3.0.6 64bit
 1
Author: Marc M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-26 19:09:51

Sprawdź swoje php.ini dla enable_post_data_reading=On , ponieważ:

Wyłączenie tej opcji powoduje, że $_POST i $_FILES nie będą wypełniane. Jedynym sposobem na odczytanie danych postdata będzie wrapper PHP://input stream. (... )

W http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading

 1
Author: jmng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-18 10:09:03

Mam ten sam problem i żaden z nich nie był moim błędem. Sprawdź swoje .plik htaccess, jeśli go masz, jeśli włączona jest opcja "MultiViews". Musiałem je wyłączyć.

 0
Author: Murolack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 18:58:14

Jeśli twoim głównym skryptem jest http://Some_long_URL/index.php należy ostrożnie podać pełny adres URL (z jawnym index.php i , a nie tylko http://Some_long_URL) w polu action. O dziwo, jeśli nie, to właściwy skrypt jest wykonywany, ale z PL pustym $_FILES !

 0
Author: Gibbie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 17:45:09

Miałem podobny problem i problem był w złej wartości w htaccess, jak wspomniał shamittomar.

Zmień php_value post_max_size 10MB Na php_value post_max_size 10M

 0
Author: Johnny Vietnam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-16 12:53:32

Byłem pusty $_FILES ponieważ po <form enctype="multipart/form-data" method="post"> umieściłem

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

Początkowy kod był jak

<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>

Postanowiłem zmodyfikować i

<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>

Więc wniosek jest taki, że po <form enctype="multipart/form-data" method="post"> musi być <input name, type, id i nie może być <div> lub jakieś inne znaczniki

W mojej sytuacji prawidłowy kod to

<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
Author: Andris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-22 06:08:24

Ja też miałem problemy z $_files pustym. Powyższa lista kontrolna nie wspomina MultiViews w .htaccess, httpd.conf lub httpd-vhost.conf.

Jeśli masz ustawione w dyrektywie options MultiViews dla katalogu zawierającego witrynę, $_FILES będzie pusty, nawet jeśli nagłówek Content-Length pokazuje, że plik, który przesłałem.

 0
Author: gerteb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-31 10:00:39

Jeśli używasz jQuery Mobile

Używanie formularza wieloczęściowego z wejściem pliku nie jest obsługiwane przez Ajax. W takim przypadku należy ozdobić formularz nadrzędny tagiem data-ajax= "false", aby upewnić się, że formularz został przesłany poprawnie na serwer.

<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
Author: Rajan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-22 17:49:03