Ostatnio, w jednym z projektów miałem potrzebę wysłania na serwer wielu plików na raz oraz wysyłania dużych plików (np. o objętości 50 MB). Standardowe rozwiązania takie, jak synchroniczne wysyłanie plików nie zdają egzaminu. W przypadku PHP, standardowy czas wykonywania skryptu, to zazwyczaj 30 sekund, więc gdy wyślemy sporo danych w tradycyjny sposób, nastąpi zerwanie połączenia. Możemy wprawdzie skorzystać z takich rozwiązań, jak applet w języku Java, ale wtedy zmuszamy użytkownika do instalacji i uruchamiania maszyny wirtualnej Javy. Kolejnym dostępnym rozwiązaniem jest SWF File Upload, ale jesteśmy wtedy zmuszani do używania technologii Flash, która już właściwie wychodzi z obiegu w świecie aplikacji internetowych. Ponadto, implementacja tego rozwiązania może być nieco problematyczna.
Z pomocą przychodzi nam jQuery File Upload. Jest to open-sourcowy projekt oparty na jQuery, który umożliwia asychnroniczne wysyłanie plików na serwer bez konieczności używania Flasha. Wszystko jest w pełni oparte o HTML5 i JavaScript.
Mamy tutaj możliwość wysłania wielu plików na raz i śledzenia postępu wysyłania na paskach postępu. Dodatkowo, jest dostępna bardzo dobra dokumentacja i gotowe przykłady użycia dla PHP, Pythona, Ruby on Rails, Javy i nawet Node.js. W dokumentacji znajdziemy też implementacje pluginu w różnych frameworkach przygotowane przez użytkowników.
Implementacja jQuery File Upload we własnych projektach nie jest trudna. Czasem warto trochę dokładniej przejrzeć dokumentację oraz API, a także pobawić się tym trochę, aby zrozumieć niektóre mechanizmy.
Przykład z demo jest dość rozbudowany, ale tak naprawdę, aby wywołać aplikację JavaScript, poza zawarciem niezbędnych plików oraz aplikacji server-side, wystarczy podać następujące polecenie:
Gdybyśmy chcieli wywołać jakąś operację, gdy wszystkie pliki zostaną wysłane na serwer (np. wyświetlić komunikat lub przekierować na inną stronę), możemy to zrobić w następujący sposób:
Jeśli chcemy odwoływać się do innych zdarzeń lub napisać bardziej skomplikowaną aplikację, warto, abyśmy zajrzeli do dokumentacji.
Gdy chcemy wysyłać duże pliki, w przypadku serwera Apache i języka PHP, należy ustawić odpowiednie parametry w pliku .htaccess dla naszej aplikacji.
php_value upload_max_filesize 50M php_value post_max_size 50M
Możemy też odpowiednio zmodyfikować plik php.ini lub pominąć ten krok, gdy serwer jest już odpowiednio skonfigurowany.
Moim zdaniem, jQuery File Upload, to obecnie najlepsze i najlepiej dopracowane rozwiązanie do asynchronicznego i masowego wysyłania wielu (także dużych) plików na serwer.




