Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Ograniczenia uploadu pliku
Forum PHP.pl > Forum > Przedszkole
zaiac
Napisałem sobie krótki skrypcik, który uploaduje pliki na serwer i sprawdza m.in. czy plik spełnia warunek wielkości pliku

  1. <?php
  2. function photoSizeCheck(){
  3.    if($this->size >= _MAX_PHOTO_SIZE){
  4.        return False;
  5.    }
  6.    else {
  7.        return True;
  8.    }    
  9. }
  10. ?>


Oczywiście działa tak jak ma działać, ale moje pytanie brzmi - czy da się w jakiś inny sposób odrzucać próbę uploadu gigantycznego pliku, który zanim się załaduje i dostanę odpowiedź o zbyt dużym rozmiarze pliku to zarżnie cały serwer?
piotrooo89
dużo zależy od konfiguracji serwera. jakie on dopuszcza możliwe uploady plików. jeśli plik będzie miał większą wielkość niż dopuszczona to pojawi się bariera w postaci serwera. można to zmieniać w regułkach .htaccess.
erix
Cytat
czy da się w jakiś inny sposób odrzucać próbę uploadu gigantycznego pliku, który zanim się załaduje

W php.ini są odpowiednie ustawienia - sprawdź. winksmiley.jpg

Poza tym, możesz jeszcze ustawić stałą (hidden) MAX_FILE_SIZE w formularzu i niektóre przeglądarki powinny wywalić ostrzeżenie, że rozmiar pliku przekracza dopuszczalny.
zaiac
O ustawieniu w php.ini wiem, ale nie mam dostępu do tego pliku. Spróbuje z ustawieniem maksymalnej wielkości pliku ale czy to nie zadziała też dopiero po załadowaniu pliku?
piotrooo89
plik jest dopiero ładowany na serwer po kliknięciu submita. plik nie zostanie wysłany jeśli jego rozmiar nie będzie taki jak jest ustawione max size. ja polecam Ci również zapozać się z wielkościami plików w .htaccess.
zaiac
hmmm no to jak inaczej uploadowac plik bez kliknięcia sumbita...
Jakieś sprawdzenie wielkości już po wybraniu pliku a przed kliknięciem? Nie bardzo rozumiem - czy mógłbyś proszę wyjaśnić co proponujesz?
piotrooo89
chodzi o to. robisz tak jak napisał ~erix i teraz - jeśli plik przekracza wielkość podaną w tym polu hidden przeglądarka albo wypluwa że plik jest za duży lub w ogóle nie wysyła tego pliku.
zaiac
Hmm w innym temacie:

http://forum.php.pl/lofiversion/index.php/t48135.html

erix napisał że nie da się tego zrobić po stronie przeglądarki. Trochę się zamieszałem smile.gif
erix
Napisałem tak, gdyż można to bardzo łatwo obejść, poza tym - nie wszystkie przeglądarki tę wartośc uwzględniają.
piotrooo89
i dlatego warto zainteresować się .htaccess'em.
zaiac
Panowie, niestety nie dam łatwo za wygraną smile.gif
Uparłem się że obsłużę ten przypadek i ... szukam nadal rozwiązania. W tej chwili wygląda to tak:

  1. <?php
  2. function photoUpload($photo){
  3.  
  4.    if (!is_uploaded_file($photo['tmp_name'])){
  5.        
  6.        echo '<div id="error_message">Wystąpił błąd podczas wysyłania pliku na serwer!</div>';
  7.        switch ($photo['error']){  
  8.             case 1:
  9.                   echo '<div id="error_message">Plik jest większy niż ustawienia serwera.</div>';
  10.                   break;
  11.            case 2:
  12.                   echo '<div id="error_message">Plik jest większy niż pozwalamy na formularzu.</div>';
  13.                   break;
  14.            case 3:
  15.                   echo '<div id="error_message">Tylko część pliku została zapisana.</div>';
  16.                   break;
  17.            case 4:
  18.                   echo '<div id="error_message">Nie wybrano pliku do zapisania.</div>';
  19.                   break;
  20.         }
  21.        @unlink($photo['tmp_name']);
  22.    }
  23.    
  24.    else{
  25.              //normalny upload
  26.          }
  27. ?>


  1. <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
  2. <input type="file" name="_file" size="24"/>


Jak próbuję wrzucić plik 2MB to jest w miarę ok - dostaję odpowiedz z case 2 i wszystko gra. Natomiast jak próbuje wrzucić jakiś film to już gorzej smile.gif Mieli, mieli i mielić nie chce przestać. W jaki sposób można temu zaradzić.
@piotrooo89 - w jaki sposób proponujesz wykorzystać .htaccess?
Pilsener
Nic nie poradzisz, przecież nie sprawdzisz, jakiej wielkości plik użytkownik ma zamiar Ci wysłać. To tak samo, jakby sąsiad spuszczał Ci z góry rolkę papieru toaletowego - odbierasz ten papier życia i odbierasz, ale nie wiesz tak naprawdę, ile jest go na rolce, możesz zliczać metry (ograniczenie w php.ini i .htaccess, maksymalna wielkość pliku jaką można wysłać przez POST) albo po odebraniu rolki ją zważyć (ale będziesz ją miał już u siebie w chacie, czyli na serwerze) - to rozwiązanie sprawdzi się, jeśli chcesz ustawić rozmiar mniejszy, niż w php.ini i nie chcesz na stałe zmieniać konfiguracji serwera.

Jest jeszcze jedna opcja: przykręcić kurek z transferem tego pliku, ale nigdy tego nie używałem i nie wiem, czy da się tak zrobić - wtedy plik się pomału ładuje i nie wpływa to tak bardzo na pracę serwera.
erix
Cytat
odbierasz ten papier życia i odbierasz, ale nie wiesz tak naprawdę, ile jest go na rolce, możesz zliczać metry

Gdybyś napisał skrypt odbierający plik w np. Perlu, to byłaby taka możliwość, gdyż oferuje większe możliwości kontrolowania żądania.
wytrwale_szukający
Witam.
Wiem, ze temat stary, ale po przejrzeniu kilkudziesięciu podobnych tematów postanowiłem kontynuować wątek.
Znalazłem taki skrypt:
http://stackoverflow.com/questions/3717793...size-validation
a dokładnie tak to działa:
http://jsbin.com/ulamor

Wiem, że w starszych przeglądarkach to nie działa, ale większość ma już nowe, dla tych co mają stare pozostaje czekanie na upload i sprawdzenie po stronie serwera.
Proszę o opinie "czy to jest czegoś warte"

Druga sprawa, jest tam post o sprawdzania w jQuery - czy takie sprawdzanie odbywa się po stronie klienta czy serwera?
Jeśli po stronie klienta to jak dokładnie go użyć? (chodzi o post z oznaczeniem "// Using jquery")

Z góry dziękuję za odpowiedź.
wytrwale_szukający-
Temat oczywiście nieaktualny.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.