Bardzo duże uploady z PHP

Chcę zezwolić na wgrywanie bardzo dużych plików do naszej aplikacji PHP (sto megs - 8 gigs). Istnieje jednak kilka problemów z tym.

Przeglądarka:

  • przesyłanie HTML ma gówniane opinie, musimy albo ankietę dla postępu (co jest trochę głupie) lub pokazać żadnych opinii w ogóle
  • Flash uploader umieszcza cały plik w pamięci przed rozpoczęciem przesyłania

Serwer:

  • PHP zmusza nas do Ustawienia post_max_size, co może skutkować łatwy do wykorzystania atak DOS. Chciałbym nie ustawiać tego ustawienia globalnie.
  • serwer wymaga również innych zmiennych, aby były tam w Varach POST, takich jak tajny klucz. Chcielibyśmy mieć możliwość odrzucenia żądania od razu, a nie po przesłaniu całego pliku.

Wymagania:

  • HTTP jest koniecznością.
  • Jestem elastyczny z technologią po stronie klienta, o ile działa w przeglądarce.
  • PHP nie jest wymogiem, jeśli jest jakiś inny technologia, która będzie działać dobrze w środowisku linux, to jest całkowicie cool.
Author: Jon Seigel, 2009-05-14

13 answers

A może aplet Javy? Tak musieliśmy to zrobić w firmie, dla której wcześniej pracowałem. Wiem, że aplety są do bani, zwłaszcza w dzisiejszych czasach z wszystkimi dostępnymi opcjami, ale tak naprawdę są najbardziej wszechstronnym rozwiązaniem problemów związanych z komputerami, jakie napotykają w tworzeniu stron internetowych. Tylko coś do rozważenia.

 3
Author: Marc W,
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
2009-05-14 17:13:59

Upload_max_filesize można ustawić na podstawie katalogu ; to samo dotyczy post_max_size

Np.:

<Directory /uploadpath/>
  php_value upload_max_filesize 10G
  php_value post_max_size 10G
</IfModule>
 14
Author: Frank Farmer,
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
2009-05-14 18:44:36

Python Handler?

Używanie programu obsługi poczty Pythona zamiast PHP. Wygeneruj unikalny identyfikator z aplikacji PHP, który klient może umieścić w nagłówkach HTTP. Z mod_python, aby odrzucić lub zaakceptować duży upload, zanim cała treść POST zostanie przesłana.

Myślę http://www.modpython.org/live/current/doc-html/dir-handlers-hph.html

Pozwala sprawdzić nagłówki i odrzucić resztę wejścia posta. Nie próbowałem, ale może być prawo / align = "left" /

Patrząc na źródło mod_python, buforowanie wejścia przez read() wydaje się umożliwiać bit-at-time ewaluację wejścia HTTP. Nagłówki są pierwsze.

Https://svn.apache.org/repos/asf/quetzalcoatl/mod_python/trunk/src/filterobject.c

 7
Author: Aiden Bell,
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
2009-05-14 18:23:08

Jest stary wiem, ale może ktoś ma ten problem teraz też. Teraz możesz to zrobić tylko z Javascript i, powiedzmy, PHP. Po stronie klienta nie jest wymagana Flash ani Java.

Demo: http://dnduploader.filkor.org/

Chodzi o to, aby pokroić pliki za pomocą metody Blob slice() Javascript...

 7
Author: Filkor,
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-05-08 21:37:02

Możesz ustawić post_max_size tylko dla skryptów w 1 katalogu. Umieść tam swój skrypt wysyłania i pozwól, aby tylko ten skrypt obsługiwał duże rozmiary. Nadal jest możliwe, aby ten skrypt został zaatakowany dużymi / bezużytecznymi plikami, ale unika ustawiania go globalnie.

Użyj tego z APC, a może uda Ci się wypracować coś dobrego: IBM Developer works artykuł o APC

 2
Author: acrosman,
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
2009-05-14 17:26:19

Próbowałem tego wszystkiego... to jest zdecydowanie najlepsze, jakie kiedykolwiek użyłem...

Http://www.uploadify.com/

 2
Author: MichaelICE,
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
2009-06-02 03:43:44

Spójrz na jumploader.com

Dobry aplet Javy do wgrywania.

Użyłem go do przesyłania zdjęć i działa dobrze. Nie próbowałem z większymi plikami niż 10MB, ale powinienem też pracować dla naprawdę dużych plików.

 2
Author: Johan,
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
2009-07-22 23:25:44

Czy przyjrzałeś się używaniu APC do sprawdzania postępu i całkowitego rozmiaru pliku. Oto dobry post na blogu o tym. To może pomóc.

 1
Author: Peter D,
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
2009-05-14 17:19:06

Może mógłbyś użyć Webdav i Javascript w przeglądarce

AJAX Big File upload, with progress, to WebDAV

Http://www.webdavsystem.com/ajax/programming/upload_progress

Prosta biblioteka

Http://debris.demon.nl/projects/davclient.js/doc/README.html

Możesz następnie uzyskać JS, aby przekierować użytkownika na stronę sukcesu. Tajne klucze i co-nie może być obsługiwane w preludium PHP przed przekazaniem JS Klient - > WebDAV

 1
Author: Aiden Bell,
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
2009-05-14 17:25:06

Chciałbym spojrzeć na FTP, SSH lub SCP to pozwala na przesłanie dużego pliku i nadal mieć kontrolę dostępu nad plikiem, jak również. To może potrwać trochę dłużej, ale to prawdopodobnie najbezpieczniejszy sposób, jaki mogłem wymyślić.

 1
Author: Phill Pafford,
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
2009-05-14 17:31:33

Odniosłem sukces z uploadify i polecam. Jest to skrypt jQuery / Flash, który obsługuje duże uploady, i można przekazać dodatkowe parametry do niego(jak tajny klucz). Aby rozwiązać problemy po stronie serwera, po prostu użyj poniższego kodu. Zmiany mają wpływ tylko na skrypt, w którym są wywoływane:

//Check to see if the key is there
if(!isset($_POST['secret_key']) || !isValid($_POST['secret_key']))
{
    exit("Invalid request");
}
function isValid($key)
{
    //Put your validation code here.
}

//This line changes the timeout.
//Give it a value in seconds (3600 = 1 hour)
set_time_limit(3600);

//Set these amounts to whatever you need.
ini_set("post_max_size","8192M");
ini_set("upload_max_filesize","8192M");

//Generally speaking, the memory_limit should be higher
//than your post size.  So make sure that's right too.
ini_set("memory_limit","8200M");

EDIT w odpowiedzi na twój komentarz:

Biorąc pod uwagę to, co powiedziałeś, obawiam się, że możesz nie być w stanie spełnić swoich wymagań przez http. Wszystkie rozwiązania istnieją kod, który dodaje funkcje do http, do których nigdy nie został zaprojektowany.

Jak sam mówiłeś, to prosty protokół. Oprócz pisania własnego oprogramowania klienckiego, które działa poza przeglądarką, apletem java lub za pomocą innego protokołu (jak FTP, który został do tego zaprojektowany), możesz nie dostać tego, czego chcesz.

Zrobiłem wszystko, co mogłem w ramach podanych ograniczeń. Przepraszam, że nie mogłem się bardziej postarać.

 1
Author: Andrew Ensley,
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
2009-05-14 23:32:48

Wiem, że do bani jest dodać kolejną zależność, ale z mojego doświadczenia, większość stron, które robią coś takiego, używa Flasha po stronie klienta i wgrywa duży plik jako kawałki

Adobe jako howto przy wysyłaniu plików flash

Znalazłem również ten tutorial na codeproject:

Wielokrotne przesyłanie plików z paskiem postępu za pomocą Flasha i ASP.NET

PS - wiem, że używasz PHP, a nie. NET, uznałem, że ważną częścią jest flash ;)

 0
Author: Jiaaro,
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
2009-05-14 17:38:15

Spróbuj tego: http://www.simple2ftp.com używa apletu FTP opartego na Javie z poziomu sprytnego opakowania aplikacji PHP.

 -1
Author: Henry R.,
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-06-26 19:21:35