Prawdziwy ajax upload

środa, 21 maja 2008

Tytuł może być trochę mylący. Bo nie jest możliwe przesyłanie plików poprzez XMLHTTPRequest! Wszystkie znane Wam z sieci ajaxowe uploady bazują na pewnych trickach, o których zamierzam opowiedzieć.

IFrame

Tak to ten sam stary dobry IFRAME, kiedy web nie miał jeszcze numerka, a na stronach www rządził kolor szary i niebieskie linki. Minęło trochę czasu i ten znacznik został zapomniany, a nawet wyklęty. Jednak bez ten trick nie będzie mógł działać.
Przepis jest prosty. Formularz z polem input type="file" umieszczamy w pływającej ramce. Kiedy naciśniemy przycisk wyślij - zacznie się uplodowanie pliku, ale wszystkie pięknie w ‘tle’. Można dodać indykator tak, aby użytkownik myślał, że to ajax.

Plusy

  • Bardzo proste rozwiązania

Minusy

  • Brak paska postępu
  • Można uploadować tylko jeden plik naraz

Flash upload

Kolejne rozwiązanie bazuje na flashu i javascript. Cały proces uploadu przechodzi przez ‘niewidzialny’ obiekt flasha. Sposób jest prawie idealny… problem tkwi w tym, że flash uruchamia własną sesje. A to jest dużym problemem (np. autoryzacja). Rozwiązanie tego problemu to przejęcie sesji, w php można to uzyskać poprzez session_id($passedId).

swfupload logo

Moim zdaniem najlepsza implementacją uploadu z wykorzystanie flashu jest biblioteka swfupload. Jest napisane w czystym javascripcie, dlatego można ją integrować z dowolnym innych kodem js. Ma sporą społeczność i jest ciągle rozwijana

Plusy

  • Można zaznaczyć wiele plików naraz
  • Pasek postępu dla każdego pliku
  • Wstępna walidacja przed uplodem

Minusy

  • tworzy własną sesje
  • limit wielkości pliku do 100MB

swfupload

Społeczność: Powiązane posty:

Komentarze

  1. Szymon

    Z tego co kojarze w przypadku iframe można uploadować kilka plików, tak jak w przypadku zwykłych formularzy, czyli poprzez dodanie kilku pól typu file.

  2. Hubert Marzec

    A jednak będzie prawdziwy Ajax Upload, ale na razie tylko w FireFox 3:
    firefox-3-native-aja

    @Szymon tak masz racje, ale chcesz wgrać 20 zdjęci to musisz utworzyć 20 pól file i użytkownik musi wypełnić każde pole osobno, co na pewno nie jest wygodne.

  3. piotr

    Ja u siebie zastosowałem iframe. Wiem, że dla wielu koderów jest to “powrót do przeszłości” i jedynie xhtml 1.0 jeszcze nie deprecjonuje tego znacznika, aczkolwiek wydaje mi się ten sposób o wiele lepszy niż zastosowanie ajax, gdzie nie zawsze mamy pewność iż zadziała. Ramki - jeszcze będą długo istnieć, zapewne nawet HTML 5 będzie pozwalał na stosowanie ramek.

    I oczywiście upload plików przy zastosowaniu ramki jest o wiele wygodniejszy w przypadku błędu podczas uploadu. Jedyna wada iframe to, że nie dopasowuje się do zawartości pliku, ale i na to znalazłem sposób, czyli js hack na stronie http://www.dynamicdrive.com

Dodaj komentarz