File upload progress

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ć?

Jedyne co znam w temacie:


przy czym link do strony Seana jest złamany i tutaj jest działająca kopia:
http://web.archive.org/web/20070315071132/http://sean.treadway.info/articles/2005/07/18/upload-progress-checklist

Trzeba pewnie trochę pogrzebać żeby zrobić to z passengerem. Ktoś chętny?

PS:
http://groups.google.com/group/phusion-passenger/browse_thread/thread/cd546d47ad410c4e/30bca4b4b83ad05c?#30bca4b4b83ad05c
Dammit :frowning:

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 :wink: )

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 :wink:

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ć.

Pozdrawiam

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 :slight_smile:

Jutro postaram się wrzucić jakiś tutorial pokazujący jak łatwo można zaimplementować taki przydatny paseczek u siebie.

Jeżeli ktoś korzysta z takiego ustrojstwa i ma jakieś aplikacje, na których może to stestować, to byłbym bardzo dźwięczny za wszelaki feedback.
git: http://github.com/drogus/apache-upload-progress-module/tree/master

Napisałem krótki tutorial z działającym demem opartym na prototype (jest też link do wersji jQuery, której używam): http://drogomir.com/blog/2008/6/18/upload-progress-bar-with-mod_passenger-and-apache

Enjoy :slight_smile:

przyznam, że fajna sprawa ^^

Nie planowałem czegoś takiego (zawsze wydawało mi się zbędnym wodotryskiem), ale przyznam, Drogomir, że mnie nakręciłeś do sprawdzenia Twojego modułu :slight_smile:

Dla mnie to jest kluczowa sprawa w miejscach gdzie trzeba wrzucać duże pliki :slight_smile:

Wrzucasz 20 mega i nie wiesz co się dzieje. Wkurzające :stuck_out_tongue:

Wkurzające to jest używanie www do wrzucania tak dużych plików :wink:

A jak user, który ledwo maila może odebrać wrzuci inaczej? :slight_smile:

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).

Zgadzam się :slight_smile:

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 :wink:

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.

Słucham sobie RailsEnvy i… właśnie Drogomir stałeś się sławny dzięki swojemu modułowi :slight_smile:

Podobno trwają prace nad zaimplementowaniem upload progress bara w przeglądarkach.

@Drogomir: gratulacje, szczególnie pragmatycznego podejścia “nie ma, trzeba napisać samemu”.
@Tomash, ale chyba nie usłyszałeś tego na ulicy?:stuck_out_tongue: 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źć :frowning: możliwe, że było to tzw. wishful thinking autora.

Tak, tak :wink: Zostałem smokiem z koszmarami :slight_smile:

Wypuściłem skrypt obsługujący pasek postępu w wersji dla jQuery z obsługą Safari. Więcej info tutaj: http://drogomir.com/blog/2008/6/30/upload-progress-script-with-safari-support

W najbliższym czasie przepiszę to również dla prototype’a i wrzucę jakiś tutorial po polskiemu.