2012-11-26 11 views
14

Ten problem wydaje się być bezpośrednio związany z niesławnym limitem 2 GB i nie jestem pewien na tej liście, czy jest to 32-bitowy PHP. Widziałem komentarze dotyczące HTTP nie są zaprojektowane dla takich dużych plików. Jednak wolałbym raczej wyczerpać ten kierunek, zanim zdecyduję się na jakąkolwiek zasadniczą zmianę w stosunku do tego, co do tej pory okazało się skuteczne. Jak sugeruje tytuł, muszę przesłać> 2 GB plików, największy jak dotąd 3,8 GB. Mam formularz zbudowany przy użyciu przesyłania plików jQuery, który nie miał żadnych problemów z wysyłaniem żadnych plików (wszystkie mniej < 2 GB), dopóki te duże się nie zaczęły. Ładowanie 3.8 GB z dysku może zająć około 5 minut, a pasek postępu do 100%. Jednak zgłaszany błąd po przesłaniu to typ 1, który sugeruje, że przekroczono limit rozmiaru pliku.Przesyłanie plików HTTP 4 GB przy użyciu jQuery-File-Upload, Apache i PHP

Jeśli monitoruję wykorzystanie dysku na serwerze podczas przesyłania, będzie miał on następujące właściwości próbki: Przed przesłaniem dysk jest używany w 30%, ponieważ przesyłanie trwa to zwiększenie wykorzystania, 31%, 32% .... 45%, 46% itp. Jednak w okolicach punktu 2 GB wykorzystanie dysku spadło do 30%, podczas gdy przesyłanie plików przez klienta/przeglądarkę jest kontynuowane. Gdy użycie dysku przez serwery przestaje rosnąć, klient może być w 60% załadowany. Mimo to klient nadal kontynuuje działanie w 100%, ale serwer nie jest akceptowany, ponieważ status dysku nigdy nie spada o 30%.

Używam 64Bit Ubuntu (najnowszy) z Apache/2.2.22 (Ubuntu) i PHP w wersji 5.3.10-1ubuntu3.2 Po wielu dniach włączania i wyłączania w poszukiwaniu rozwiązania nadal nie mogę uzyskać 3.8 GB plik do przesłania po zmianie wielu ustawień. Podam listę zmian poniżej, ale na tym etapie myślę, że może to być 32-bitowy numer PHP, więc jeśli ktoś może zaproponować link, który warto podążać, lub rozwiązanie, które warto wypróbować, byłbym wdzięczny.

W Apache2 mam ustawić:

- apache2.conf I've set Timeout to 900 
- httpd.conf I've set LimitRequestBody to 0 
- .htaccess in the file upload directory I've set: 
    - LimitRequestBody to 4939212390 
    - php_value upload_max_filesize 4831838208 
    - php_value post_max_size 4939212390 

w php.ini mam ustawić następujące:

- UPLOAD_MAX_FILESIZE 4831838208 
- POST_MAX_SIZE 4939212390 
- max_execution_time 120 
- max_input_time 60 
- memory_limit 128M 

Jeżeli uruchomić następujące na serwerze to wydawać się PHP nie ma 32-bitowego wydania, ale nie jestem pewien na tym etapie.

php -r "echo PHP_INT_MAX;" 
9223372036854775807 

Jak już wspomniałem, wszelkie pomysły byłyby mile widziane.

UPDATE:

rozwiązali ten problem, więc dzięki @BogdanBurim dla sugerując powrót do podejścia Podstawy:

udało mi się wgrać 3,8 GB plików za pośrednictwem protokołu HTTP z następującymi ustawieniami:

W Apache2 mam ustawić:

- apache2.conf I've set Timeout to 900 
- httpd.conf I've set LimitRequestBody to 0 
- .htaccess in the file upload directory I've set: 
    - LimitRequestBody to 0 
    - php_value upload_max_filesize 0 
    - php_value post_max_size 4939212390 
- .htaccess in the php temp directory (in my case its /tmp/) I've set: 
    - LimitRequestBody to 0 
    - php_value upload_max_filesize 0 
    - php_value post_max_size 4939212390 

w PHP.ini mam ustawić:

- UPLOAD_MAX_FILESIZE 0 
- POST_MAX_SIZE 4939212390 
- max_execution_time 120 
- max_input_time 60 
- memory_limit 128M 

Jedyną ważną częścią tego roztworu konieczności zdejmowania MAX_FILE_SIZE, HTML z formularza Dodano:

<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" /> 

Mając to zestaw nieustannie wywołało PHP błąd typu 2, więc php nie mógł obsłużyć większej niż 32bit liczby całkowitej, która jest ustawiona. Usunięcie spowodowało błędy PHP typu 1, dopóki nie zmieniłem UPLOAD_MAX_FILESIZE na 0 wszędzie i hej presto to działa !!!!

http://php.net/manual/en/features.file-upload.errors.php

+0

pokrewne: http://stackoverflow.com/questions/50 53290/duży plik-upload-choć-html-formularz-więcej niż-2-gb – valentinas

+0

Spróbuj przesłać plik za pomocą prostego formularza HTML i . Czy się zepsuje? Być może zobaczysz dokładny komunikat o błędzie. –

+0

Dzięki @BogdanBurim Spróbuję później i zaktualizuję – Diplonics

Odpowiedz

6

rozwiązali ten problem, więc dzięki @BogdanBurim dla sugerując powrót do podejścia Podstawy:

udało mi się wgrać 3,8 GB plików za pośrednictwem protokołu HTTP z następującymi ustawieniami:

W Apache2 I” ve ustawić:

- apache2.conf I've set Timeout to 900 
- httpd.conf I've set LimitRequestBody to 0 
- .htaccess in the file upload directory I've set: 
    - LimitRequestBody to 0 
    - php_value upload_max_filesize 0 
    - php_value post_max_size 4939212390 
- .htaccess in the php temp directory (in my case its /tmp/) I've set: 
    - LimitRequestBody to 0 
    - php_value upload_max_filesize 0 
    - php_value post_max_size 4939212390 

w php.ini mam ustawić następujące:

- UPLOAD_MAX_FILESIZE 0 
- POST_MAX_SIZE 4939212390 
- max_execution_time 120 
- max_input_time 60 
- memory_limit 128M 

Jedyną ważną częścią tego roztworu konieczności zdejmowania MAX_FILE_SIZE, HTML z formularza Dodano:

<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" /> 

Mając to zestaw nieustannie spowodował typu PHP 2 błędzie, więc php nie może obsłużyć większy niż 32bitowa liczba całkowita, która jest ustawiona. Usunięcie spowodowało błędy PHP typu 1, dopóki nie zmieniłem UPLOAD_MAX_FILESIZE na 0 wszędzie i hej presto to działa !!!!

http://php.net/manual/en/features.file-upload.errors.php

+0

Czy testowałeś we wszystkich wersjach przeglądarki (IE 7+ i FF12 +) i czy działa on we wszystkich tych przeglądarkach? Czy użycie prostego 'HTML''

+0

@VikasV Nie testowałem go na żadnej platformie IE, ale zrobię to teraz, o co poprosisz. Działa dobrze na FF i CH, jednak problem nigdy nie był dla mnie przeglądarką klienta. Zarówno w przypadku FF, jak i CH, jeśli wysłano plik, ale zawsze zgłaszano częściowy problem z przesyłaniem plików dla plików 2 GB + na końcu serwera, który został dla mnie poprawiony zgodnie z powyższymi ustawieniami. – Diplonics

+0

LimitRequestBody przyjmuje wartość '0' (bez ograniczeń) w [Apache 2.4] (https://httpd.apache.org/docs/2.4/mod/core.html#limitrequestbody), być może także w innych wersjach. – chb

-7

Powstaje pytanie, dlaczego należy użyć przeglądarki, aby załadować> 1GB. Rozważ najlepsze usługi udostępniania plików, które najczęściej przesyłają limit plików do 1 GB za pośrednictwem przeglądarki. Co się stanie, jeśli pobieranie użytkownika zakończy się niepowodzeniem, konieczne będzie ponowne uruchomienie całego procesu.

Szukasz rozwiązań alternatywnych, jeśli masz takie duże pliki do pobrania, torrenty, ftp lub klienta do przesyłania osobistego, takie jak rapidshare, fileupload, megaupload itp.

Jesteś ograniczony ze względu na limit rozmiaru plików ustawiony na POST. Jeśli jesteś zdeterminowany, aby używać HTTP do przesyłania większych plików, które zniechęciłybym, optymalnym rozwiązaniem byłoby podzielenie pliku i przesłanie mniejszych podzielonych części, a następnie ponowne złożenie pliku.

+0

może [s] on buduje następną usługę udostępniania ... – mgarciaisaia

+2

"Co się stanie, jeśli pobieranie użytkownika nie powiedzie się, będziesz musiał ponownie uruchomić cały proces." emmm, nie? http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16 – valentinas

+0

Tak, to działa bardzo dobrze, kończąc na uszkodzonych plikach. Głupio jest przesyłać tak duże pliki w ten sposób. –

0

Jeśli masz dostęp do apache virtualhost config można także zmienić te ustawienia dla określonej przesyłania URL (można również dodać do pliku .htaccess):

Z tym kodem:

<LocationMatch "/index.php/url-of-your-upload.php"> 
    php_value max_execution_time 0 
    php_value upload_max_filesize 0 
    php_value post_max_size 4939212390 
    php_value memory_limit 4G 
    LimitRequestBody 0 
</LocationMatch> 

dyrektywy LocationMatch pozwalają wybrać adres URL (można użyć reg exp)

+0

Dało mi to błąd 500 podczas umieszczania go na moim pliku .htaccess. –

Powiązane problemy