2012-01-27 13 views
7

Używam apache, PHP.Jak zatrzymać przesyłanie zbyt dużych plików podczas przesyłania?

Tak więc, dla php, nawet ja ustawiam maksymalny rozmiar pliku, jeśli ktoś załaduje ogromny plik, załaduje całą zawartość na serwer, a następnie zwróci błąd PHP. czy to prawda?

Chciałbym, aby serwer WWW lub PHP przestały działać, gdy rozmiar pliku lub rozmiar żądania jest większy niż określony rozmiar.

Czy jest jakiś sposób na zrobienie tego? Pamiętam coś takiego jak ustawienie post_max_size lub ustawienie czegoś w pliku apache.conf, ale nie jestem pewien, czy zatrzyma się, gdy plik przekroczy maksymalny limit.

  • Nie ufam sprawdzeniu poprawności strony klienta. więc szukam rozwiązania apache lub php. :)
+0

Sprawdzanie poprawności po stronie klienta jest bardzo przyjazne dla użytkownika, spójrz na interfejs API pliku HTML5. Oczywiście wymaga to również sprawdzania poprawności po stronie serwera. – Flimm

Odpowiedz

2

Nie można tego zatrzymać po stronie serwera - plik będzie nadal przesyłany, zanim PHP zdecyduje, czy go odrzucić. Trzeba dodać to wykrywanie po stronie klienta. Chociaż nie można tego zrobić za pomocą zwykłego formularza HTML, osoby przesyłające pliki flash mogą sprawdzić rozmiar pliku przed rozpoczęciem przesyłania.

Po stronie serwera nie można zrobić nic użytecznego w PHP - pliki zawsze były już w pełni przesłane, zanim PHP ma szansę powiedzieć "nie". Aby zablokować przesyłanie (tzn. Rozłączyć klienta po drodze POST), potrzebujesz trochę magii serwera sieciowego na dole stosu. Perlbal jest w stanie to zrobić. Pisanie własnego modułu Apache jest rozwiązaniem (brutalnej siły). Używanie dowolnego rodzaju lekkiego serwera proxy przed głównym serwerem sieciowym jest rozwiązaniem, jeśli martwisz się dużymi przesyłami wiążącymi zasoby serwera WWW.

To naprawdę zależy od , dlaczego chcesz ograniczyć przesyłanie dużych plików. Jeśli chcesz zaoszczędzić czas użytkowników, po prostu dodaj wiadomości, które określają maksymalny rozmiar pliku. Jeśli są to zasoby serwera, używaj lekkiego proxy przed serwerem. Jeśli to coś innego, cóż, co to jest?

+0

Nigdy nie sprawdzanie poprawności strony klienta – ordag

+0

Serwer może przestać pobierać, kiedy chce. Założę się, że istnieje rozwiązanie, po prostu nie jestem pewien, jaki będzie niski poziom. – FakeRainBrigand

+13

@ordag, nigdy * zależny * od sprawdzania poprawności strony klienta ;-) – FakeRainBrigand

2

max_execution_time i max_input_time Ustawienia te określają maksymalny czas życia skryptu i czas, jaki skrypt powinien wydać na akceptację danych wejściowych. Jeśli zostanie przesłanych kilka megabajtów danych, max_input_time powinno być rozsądnie wysokie. Możesz zastąpić ustawienie w pliku ini przez max_input_time, wywołując funkcję set_time_limit() w twoich skryptach.

To jest wzięte z http://www.radinks.com/upload/config.php

Jeśli ustawisz niższe wartości dla tych zapisów w plikach INI skrypt powinien timeout przed upload zakończyła

+1

hmm to jest praca. – murvinlai

+0

max_execution_time w ogóle nie uwzględnia przesyłania plików. max_input_time to tylko * pars * czas, który jest zwykle podsekundowy, nawet w przypadku przesyłania wielu gigabajtów. Te ustawienia tutaj nie pomagają. – Cal

1

Użyj ukrytego pola o nazwie MAX_FILE_SIZE z wartością wskazującą maksymalny rozmiar pliku w bajtach. See Example #1 on this page w celu uzyskania dalszych informacji.

<!-- The data encoding type, enctype, MUST be specified as below --> 
<form enctype="multipart/form-data" action="__URL__" method="POST"> 
    <!-- MAX_FILE_SIZE must precede the file input field --> 
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> 
    <!-- Name of input element determines name in $_FILES array --> 
    Send this file: <input name="userfile" type="file" /> 
    <input type="submit" value="Send File" /> 
</form> 
+2

'MAX_FILE_SIZE' jest tylko dobrowolnym wskaźnikiem użytkownika, więc przeglądarki mogą ostrzec klientów, w żaden sposób nie jest wymuszane/egzekwowalne. – Wrikken

+0

To jest to, co początkowo sądziłem, ale podręcznik PHP pozwolił mi pomyśleć, że upload został natychmiast odrzucony, jeśli był zbyt duży. W pewnym sensie ma to sens, jeśli tak nie jest, ale zależy to od tego, które "dane meta" zostaną wysłane o pliku. Przepraszam za niepoprawne informacje. – Andy0708

+0

To nie robi nic, jeśli chodzi o przeglądarki, wszystko, co robi, to wysyła dodatkową wartość w danych POST. Zobacz http://stackoverflow.com/q/1381364/247696 – Flimm

0

Użyj $ _FILES w php.

if($_FILES['name']['size'] > $limit){ 
// continue; 
} 
+7

Ten kod zostanie wykonany po ukończeniu przesyłania, jak sądzę. – Andy0708

4

Apache's LimitRequestBody, AFAIK, to po prostu przerywa połączenie, gdy podchodząc ....

+4

To działa, ale daje stronę błędu Apache, zamiast przekazywać kontrolę do PHP. Błąd jest kodem 413 i może być obsługiwany przez opcję "ErrorDocument". Jednak dziwny błąd Apache w niektórych wersjach spowoduje, że żądana strona zostanie zwrócona * dodatkowo * do dokumentu błędu. Dziki! – Cal

+0

Aby dodać do zabawy, niektóre wersje Apache pominą stronę błędu i po prostu zamkną połączenie po osiągnięciu limitu. Niektóre wersje pokażą błąd do pewnego rozmiaru powyżej limitu, ale zamknij połączenie w innym (dowolnie wybranym) limicie. – Cal

+0

Nie uruchamiaj go na uszkodzonych serwerach Apache: P Masz rację, oczywiście nie jest to zbyt przyjazne dla użytkownika. To jednak pasuje do rachunku _ "Chciałbym, aby serwer WWW lub PHP przestały działać" _, decydując się na pierwszy. Oszczędź za umieszczenie proxy przed serwerem sieciowym, nie znam innej metody. – Wrikken

0

Użyj czasomierza (limit czasu) dla każdego przesyłania z funkcją postępu sesji w PHP 5.5 i zmierzyć średni czas na wielkość wysyłania.