Miałem zrobiony fajny zestaw skryptów do działającego paska postępu, a wszystko chodziło na Nginxie w połączeniu z tym modułem: http://wiki.codemongers.com/NginxHttpUploadProgressModule . Jakiś czas temu kilku bandytów wypuściło mod_rails, a następnie mod_passenger i przesiadłem się cholera na apacha, a do apacha żadnego fajnego modułu w tym stylu nie mogę znaleźć.
Implementował może ktoś upload progress bar z apachem? Jest coś co zwracałoby potrzebne dane, czy trzeba się samemu w takie rzeczy bawić?
W ramach przypomnienia sobie trochę C i chęci poeksperymentowania napisałem upload_progress_module do apacha. Kod jest tutaj: http://github.com/drogus/apache-upload-progress-module/tree/master . Tylko uwaga, moduł nie jest jeszcze skończony i nie był testowany w produkcji - u mnie na razie działa, ale mogą być jeszcze problemy, będę musiał go potestować i dodać trochę wiadomości do debugowania.
Moduł jest inspirowany podobnym modułem do nginxa - zostawiłem ten sam format raportowania (JSON), więc jeżeli ktoś już ma zaimplementowany progress bar do nginxa, to powinien działać również z apachem (aczkolwiek sprawdzę to zapewne dopiero jutro )
Jeżeli chodzi o wykorzystanie, to jak skończę napiszę tutorial - jak można zaimplementować progress bar korzystając z jQuery i owego modułu (mod_passneger nie jest wymagany, upload_progress_module jest od niego niezależny).
Podkreślam też, że nigdy nie byłem jakimś mastachem w C, więc jakby ktoś chciał się zagłębiać i zobaczył rażące błędy w implementacji, to prosiłbym o jakieś info
No i muszę to napisać: dokumentacja API apacha do pisania modułów jest biedna i większość rzeczy trzeba samemu obczaić wspomagając się przykładami w postaci innych modułów do apacha. Na szczęście niektóre są nieźle pokomentowane i dało się coś z tego zrobić.
Poprawiłem trochę upload-progress-module, dodałem czyszczenie pamięci i czyszczenie wszystkiego przy wyjściu.
Wrzuciłem moduł na serwer, na którym stoją aplikacje, w których był zaimplementowany nginx-upload-progress i bez zupełnie żadnych zmian progress bar działa całkiem ładnie
Jutro postaram się wrzucić jakiś tutorial pokazujący jak łatwo można zaimplementować taki przydatny paseczek u siebie.
Wkurzajace jest to ze nie da sie:
a) wysylac kilku plikow na raz
b) sterowac dialogiem uploadowania z poziomu js (owatwarcie okna dialogowego, handlery jego akcji, filtr, zabezpieczenia przed niepowolanymi otwarciami takiego okna itp)
b) i w owych czasach chyba najwazniejsze, wysylanie plikow ajax’em
c) upload progress w standardzie w3c
Istnieje http://www.w3.org/TR/file-upload/ ale nikt go nie ruszal od 2 lat, Ponoc webforms oraz maja miec jakies wzmianki o podobnej funkcjonalnosci, ale tak czy siak to wszystko odbywa sie zbyt wolno.
Podpisuję się pod tym co napisał PaK (chyba dyskutowaliśmy o tym w drodze na Euruko ;)).
To jest wkurzające, że żeby uzyskać informacje o postępie uploadu musimy zapytać o to serwer, podczas gdy dobrze o tym wie i bez udziału sieci mogłaby nam o tym powiedzieć przeglądarka. Mogłaby istnieć jakaś funkcja w js, która zwracałaby informacje u aktualnie uploadowanych plikach z obecnego okna przeglądarki (główne okno + ew. framesy). I nie ma tu problemu bezpieczeństwa bo dostawałoby się tylko info z danego okna (ew. z tej samej domeny).
A co do progress bara to nie uważam go za zbyteczny. Przy obsłudze dużych plików jest to właściwie pożądane by wiedzieć jaki jest postęp i czy przypadkiem coś się po drodze nie zwiesiło. Gdyby obsługa była zaimplementowana tak jak zaproponowałem to praktycznie każdy upload przez www miałby taki progress bo jego koszt równałby się jakiemuś prostemu skryptowi w js. W tej chwili to sami wiecie jak to wygląda.
I jeszcze mi taka sprawa przyszła do głowy. Już na poziomie js można by było załatwiać kwestię wielkości uploadowanych plików i powiadomić użytkownika o przekroczeniu limitu wielkości na plik etc (oczywiście nie miałoby to stanowić mechanizmu obrony przed dużym uploadem).
Takie API byłoby bardzo dużym ułatwieniem. Z tym zawsze były problemy. Najpierw jakaś partyzantka, później mongrel upload progress, później czekanie na nginx upload progress (domyślnie nginx cachował upload i nie dało się uzyskać info), teraz mod_passenger
Ale trzeba sobie jakoś radzić. Zrobienie upload progress bara powyższą metodą nie jest zbyt trudne. Jeżeli chodzi o wrzucanie wielu plików na raz, to można sobie radzić używając flasha (nie próbowałem). Ja udostępniam wrzucanie zipów - nie jest to rozwiązanie problemu, ale całkiem pomocne.
@Drogomir: gratulacje, szczególnie pragmatycznego podejścia “nie ma, trzeba napisać samemu”. @Tomash, ale chyba nie usłyszałeś tego na ulicy? Podałbyś jakiegoś linka :).
Pluję sobie w brodę, bo taki nagłówek widziałem na reddicie, a nie kliknąłem i nie potrafię tego teraz znaleźć możliwe, że było to tzw. wishful thinking autora.