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

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

Dodaj mój rss to swojego czytnika.

Thursday, May 22, 2008 12:05 pm
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.
Friday, May 30, 2008 5:22 pm
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.
Friday, January 30, 2009 2:40 pm
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