Mam zainstalowany WampServer 2 na moim komputerze z systemem Windows 7. Używam Apache 2.2.11 i PHP 5.2.11. Kiedy próbuję załadować dowolny plik z formularza, wydaje się, że ładuje się, ale w PHP $_FILES
tablica jest pusta. W c:\wamp\tmp
folderze nie ma pliku . Skonfigurowałem php.ini
zezwalanie na przesyłanie plików i tym podobne. tmp
Folderu przeczytał przywileje / zapisu dla bieżącego użytkownika. Jestem zdumiony.
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
źródło
źródło
vanilla-upload.php
?Odpowiedzi:
Oto lista kontrolna do przesyłania plików w PHP:
Sprawdź php.ini pod kątem:
file_uploads = On
post_max_size = 100M
upload_max_filesize = 100M
.htaccess
lub.user.ini
jeśli korzystasz z hostingu współdzielonego i nie masz do niego dostępuphp.ini
.phpinfo()
funkcji, aby sprawdzić, czy ustawienia są faktycznie stosowane.100M
nie100MB
.Upewnij się, że
<form>
tag maenctype="multipart/form-data"
atrybut. Żaden inny tag nie będzie działał, musi to być tag FORMULARZA. Dokładnie sprawdź, czy jest wpisany poprawnie . Dokładnie sprawdź, czy dane wieloczęściowe / formularze są otoczone prostymi cudzysłowami, a nie inteligentnymi cudzysłowami wklejonymi z Worda LUB z bloga na stronie internetowej (WordPress konwertuje proste cudzysłowy na cudzysłowy pod kątem!). Jeśli masz wiele formularzy na stronie, upewnij się, że oba mają ten atrybut. Wpisz je ręcznie lub wypróbuj proste pojedyncze cudzysłowy wpisywane ręcznie.Upewnij się, że nie masz dwóch pól pliku wejściowego z tym samym
name
atrybutem. Jeśli potrzebujesz obsługiwać wiele, umieść nawiasy kwadratowe na końcu nazwy: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
.Upewnij się, że miejsce docelowe pliku i katalogi tmp / upload nie zawierają spacji.
Upewnij się, że wszystkie
<form>
pozycje na Twojej stronie mają</form>
zamknięte tagi.Upewnij się, że tag FORMULARZA ma
method="POST"
. Żądania GET nie obsługują przesyłania danych wieloczęściowych / formularzy.Upewnij się, że znacznik wejściowy pliku ma atrybut NAME. Atrybut ID NIE jest wystarczający! Atrybuty ID są używane w DOM, a nie w ładunkach POST.
Upewnij się, że nie używasz Javascript do wyłączenia
<input type="file">
pola podczas przesyłaniaUpewnij się, że nie zagnieżdżasz form takich jak
<form><form></form></form>
Sprawdź strukturę HTML pod kątem nieprawidłowych / nakładających się tagów, takich jak
<div><form></div></form>
Upewnij się również, że przesyłany plik nie zawiera żadnych znaków innych niż alfanumeryczne.
Kiedyś spędziłem godziny, próbując zrozumieć, dlaczego tak się nagle stało. Okazało się, że zmodyfikowałem niektóre ustawienia PHP w programie
.htaccess
, a jedno z nich (jeszcze nie wiem, które) powodowało niepowodzenie przesyłania i$_FILES
było puste.Możesz potencjalnie spróbować uniknąć podkreślenia (
_
) wname=""
atrybucie<input>
taguSpróbuj przesłać bardzo małe pliki, aby zawęzić, czy jest to problem z rozmiarem pliku.
Sprawdź dostępne miejsce na dysku. Chociaż jest to bardzo rzadkie, jest wspomniane w komentarzu do strony podręcznika PHP :
Upewnij się, że nie przesyłasz formularza za pośrednictwem żądania AJAX POST zamiast zwykłego żądania POST, które powoduje ponowne załadowanie strony. Przeszedłem przez każdy punkt powyższej listy i w końcu dowiedziałem się, że powodem, dla którego moja zmienna $ _FILES była pusta, było przesyłanie formularza za pomocą żądania AJAX POST. Wiem, że istnieją metody przesyłania plików przy użyciu Ajax, ale może to być ważny powód, dla którego tablica $ _FILES jest pusta.
Źródło niektórych z tych punktów:
http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/
źródło
<form><form><input type="file"></form></form>
$('#my-form')[0].reset();
w obsłudze przesyłania.Jeśli chodzi o HTML, wydaje się, że poprawnie ustawiłeś tę część. Masz już
enctype="multipart/form-data"
co jest bardzo ważne w formularzu.Jeśli chodzi o
php.ini
konfigurację, czasami w systemachphp.ini
istnieje wiele plików. Upewnij się, że edytujesz właściwy. Wiem, że powiedziałeś, że skonfigurowałeś swójphp.ini
plik do przesyłania plików, ale czy ustawiłeś również swójupload_max_filesize
ipost_max_size
był większy niż plik, który próbujesz przesłać? Więc powinieneś mieć:Czy Twój katalog:
"c:\wamp\tmp"
ma uprawnienia do odczytu i zapisu? Czy pamiętałeś o ponownym uruchomieniu Apache po wprowadzeniuphp.ini
zmian?źródło
Ważne jest, aby dodać
enctype="multipart/form-data"
do swojego formularza przykładźródło
Dziękuję wszystkim za różnorodne wyczerpujące odpowiedzi. To wszystko jest bardzo pomocne. Odpowiedź okazała się czymś bardzo dziwnym. Okazuje się, że PHP 5.2.11 nie lubi:
lub
Jeśli zmienię to na
2047M
, przesyłanie działa.źródło
Mam ten sam problem, patrząc na 2 godziny, jest bardzo proste, aby najpierw sprawdzić konfigurację naszego serwera.
Przykład:
każdy typ rozmiaru pliku to
:20mb
, ale naszupload_max_size
jest powyżej,20mb
ale tablica jestnull
. Odpowiedź brzmi: naszepost_max_size
powinno być większe niżupload_max_filesize
źródło
Oto kolejna przyczyna, którą znalazłem: Podczas korzystania z JQuery Mobile i atrybutu formularza data-ajax jest ustawiony na true, tablica FILES będzie pusta. Więc ustaw data-ajax na false.
źródło
Upewnij się, że element wejściowy ma atrybut „nazwa”.
<input type="file" name="uploadedfile" />
Jeśli tego nie ma, $ _FILES będzie puste.
źródło
Zmagałem się z tym samym problemem i wszystko testowałem, nie otrzymywałem raportów o błędach i nic nie wydawało się być w porządku. Miałem error_reporting (E_ALL) Ale nagle zdałem sobie sprawę, że nie sprawdziłem dziennika Apache i voilà! Wystąpił błąd składni w skrypcie ...! (brakujące „}”)
Więc chociaż jest to coś oczywistego do sprawdzenia, można o tym zapomnieć ... W moim przypadku (linux) jest to:
źródło
Nikt o tym nie wspomniał, ale pomogło mi to i niewiele miejsc w sieci o tym wspomina.
Upewnij się, że Twój php.ini ustawia następujący klucz:
Jeśli chcesz, abyś używał bezwzględnej ścieżki do pliku serwera, musisz skontaktować się z usługodawcą hostingowym. Powinieneś być w stanie zobaczyć inne przykłady katalogów w pliku php.ini, aby to ustalić. Jak tylko to ustawię, otrzymałem wartości w moim obiekcie _FILES.
Na koniec upewnij się, że twój folder tmp i wszędzie tam, gdzie przenosisz pliki, mają odpowiednie uprawnienia, aby można je było odczytywać i zapisywać.
źródło
Jeśli próbujesz przesłać tablicę plików to może trzeba zwiększyć
max_file_uploads
wphp.ini
którym jest domyślnie ustawiony na20
Uwaga :
max_file_uploads
NIE można tego zmienić poza php.ini. Zobacz „Błąd” PHP # 50684źródło
Innym możliwym winowajcą są przekierowania Apache. W moim przypadku skonfigurowałem httpd.conf apache tak, aby przekierowywał niektóre strony w naszej witrynie do wersji http, a inne strony do wersji https strony, jeśli jeszcze nie były. Strona, na której miałem formularz z plikiem wejściowym, była jedną ze stron skonfigurowanych do wymuszania ssl, ale strona wyznaczona jako akcja formularza została skonfigurowana jako http. Tak więc strona przesłałaby przesyłkę do wersji ssl strony akcji, ale apache przekierowywał ją do wersji http strony, a dane postu, w tym przesłany plik, zostały utracone.
źródło
Sprawdź swój php.ini pod kątem enable_post_data_reading = On , ponieważ:
W http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading
źródło
Jeśli twój główny skrypt jest
http://Some_long_URL/index.php
ostrożny, podaj pełny adres URL (z wyraźnymindex.php
i nie tylkohttp://Some_long_URL
) waction
polu. Zaskakujące jest to, że jeśli nie, wykonywany jest właściwy skrypt, ale z pustą wartością en $ _FILES!źródło
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 po prostu używać przeglądarki bezpośrednio. URL wygenerowany przez IDE wyglądał następująco:
i po prostu używając:
działało dobrze. Moja konfiguracja to PC / Windows 10 / WAMPSERVER 3.0.6 64bit
źródło
Nie ufaj lokalizacji folderu tymczasowego dostarczonej przez
sys_get_temp_dir
jeśli jesteś we współdzielonym środowisku hostingu.Oto jeszcze jedna rzecz do sprawdzenia, o której jeszcze nie wspomniano ...
Oczywiście założyłem, że folder, w którym mój skrypt PHP przechowuje tymczasowe przesłane pliki, to folder
/tmp
. To przekonanie zostało wzmocnione faktem, żeecho sys_get_temp_dir() . PHP_EOL;
powraca/tmp
. Również,echo ini_get('upload_tmp_dir');
nic nie zwraca.Aby sprawdzić, czy przesłany plik faktycznie pojawia się na krótko w moim
/tmp
folderze, dodałemsleep(30);
oświadczenie do mojego skryptu (zgodnie z sugestią tutaj ) i przeszedłem do mojego/tmp
folderu w cPanel File Manager, aby zlokalizować plik. Jednak bez względu na wszystko przesłanego pliku nigdzie nie było.Spędziłem godziny, próbując ustalić przyczynę takiego stanu rzeczy, i wdrożyłem każdą sugestię, która została tu przedstawiona.
Wreszcie, po przeszukaniu plików mojej witryny pod kątem zapytania
tmp
, odkryłem, że moja witryna zawiera inne foldery nazwanetmp
w innych katalogach. Zdałem sobie sprawę, że mój skrypt PHP faktycznie zapisuje przesłane pliki do.cagefs/tmp
. ( „Pokaż ukryte pliki” Aby wyświetlić ten folder, ustawienie musi być włączone w cPanel).Dlaczego więc
sys_get_temp_dir
funkcja zwraca niedokładne informacje?Oto wyjaśnienie ze strony PHP.net dla
sys_get_temp_dir
(tj. Najwyższy komentarz):Ten post dotyczący SO zagłębia się również w problem:
źródło
Mam ten sam problem i żaden z motywów nie był moim błędem. Sprawdź swój plik .htaccess, jeśli go masz, jeśli „MultiViews” jest włączone. Musiałem je wyłączyć.
źródło
Miałem podobny problem i problem miał niewłaściwą wartość w htaccess, jak wspomniał shamittomar.
Zmień
php_value post_max_size 10MB
naphp_value post_max_size 10M
źródło
Byłem pusty,
$_FILES
ponieważ po<form enctype="multipart/form-data" method="post">
umieszczeniuPoczątkowy kod był podobny
Postanowiłem zmodyfikować i
Tak więc wniosek jest taki, że after
<form enctype="multipart/form-data" method="post">
musi być<input name, type, id
i nie może być<div>
lub jakieś inne tagiW mojej sytuacji poprawny kod to
źródło
Ja też miałem problemy z pustymi plikami $ _FILES. Powyższa lista kontrolna nie wspomina o wielu widokach w .htaccess, httpd.conf lub httpd-vhost.conf.
Jeśli masz ustawione MultiViews w dyrektywie options dla twojego katalogu zawierającego witrynę internetową, $ _FILES będzie puste, nawet jeśli nagłówek Content-Length pokazuje, że przesłany przeze mnie plik.
źródło
Jeśli używasz JQuery Mobile
Używanie formularza wieloczęściowego z plikiem wejściowym nie jest obsługiwane przez Ajax. W takim przypadku powinieneś udekorować formularz nadrzędny danymi data-ajax = "false", aby upewnić się, że formularz został poprawnie przesłany na serwer.
źródło
Odłącz swój formularz od strony, której używasz, do prostej strony php, która zawiera tylko formularz i kod php, i przetestuj go w ten sposób.
Każdy skrypt bootstrap lub java może wyczyścić _FILES []. To był mój przypadek
źródło