Upload plików bez przeładowania strony
Tagi: AJAX, HTML, JavaScript, jQuery, LiteUploader, PHP, upload
Jednym z ciekawszych zastosowań AJAX-a i HTML5, które poszerza funkcjonalność zwykłej strony i usprawnia interakcje użytkownika jest upload plików bez przeładowania strony. File API wprowadzone w HTML5 daje koderowi opcje przekazywania informacji o plikach za pomocą XMLHttpRequest. Oczywiście, również do tego celu powstały dziesiątki rozszerzeń i gotowych skryptów, które wystarczy dodać na stronę, skonfigurować i nie martwić się o nic więcej.
Ja szukałem jednak czegoś jak najprostszego, aby samodzielnie dopasować do wcześniej stworzonej już aplikacji. Znalazłem ostatecznie plugin jQuery o nazwie LiteUploader – naprawdę prosta wtyczka o dużych możliwościach, wszystko sprowadza się do inicjalizacji i wykorzystania odpowiednich zdarzeń.
Oprócz kodu JavaScript potrzebny będzie plik PHP, który odbierze plik i zapisze na serwerze. Zasada działania nie różni się wiele od zwykłego uploadu – musimy:
- za pomocą tablicy $_FILES zobaczyć czy załadowanie pliku się udało
- sprawdzić format pliku i/lub jego wagę, jeśli chcemy
- przenieść plik tymczasowy do docelowego folderu
- zwrócić rezultat – przekazać wiadomość o powodzeniu lub błędzie
Zacznę jednak od kodu HTML na stronie, czyli przede wszystkim zwykłego pola o identyfikatorze fileUpload:
<input type="file" name="file" id="file_upload" /> <button type="button" id="upload_button">Upload</button>
Jak widać, mamy tam pole umożliwiające upload pliku oraz przycisk zatwierdzający. Tyle jak na razie w zupełności nam wystarczy.
Kolej na wspomniany plik PHP, można go nazwać np. ajax_file_uploader.php i wrzucić do głównego folderu strony.
<?php if($_FILES['file']['name'][0]) { $path = 'files/'.$_FILES['file']['name'][0]; if(move_uploaded_file($_FILES['file']['tmp_name'][0], $path)) { echo json_encode('ok'); exit; } } echo json_encode('error'); ?>
Wybrany plik zostanie skopiowany do folderu files (trzeba go jednak najpierw utworzyć i ustawić odpowiednie uprawnienia) pod oryginalną nazwą. W przypadku powodzenia żądanie zwróci do przeglądarki ciąg ok, w przeciwnym razie error. Na marginesie: jeśli informacje o pliku zapisujecie również w bazie danych, być może przydatne będzie zamiast komunikatu ok przekazanie identyfikatora w tabeli dodanego rekordu.
Teraz ściągamy LiteUploader (https://raw.githubusercontent.com/burt202/lite-uploader/master/jquery.liteuploader.min.js) oraz jQuery (http://code.jquery.com/jquery.min.js) i wgrywamy na serwer, a następnie dołączamy do strony:
<script type="text/javascript" src="js/jquery.min.js"></script> <script type="text/javascript" src="js/jquery.liteuploader.min.js"></script>
a następnie zabieramy się do pisania kodu, który “ożywi” nasz dotychczasowy formularz przy pomocy LU. Można umieścić go razem z jquery.liteuploader.min.js np. jako uploader.js (oczywiście nie zapominając o załączeniu go w sekcji head!).
$(document).ready(function() { $('#file_upload').liteUploader({ 'script': 'ajax_file_uploader.php', 'changeHandler': false, 'clickElement': $('#upload_button') }) .on('lu:before', function(e, files) { if($('#upload_status').length == 0) $('#upload_button').after('<p id="upload_status">Wczytywanie: <span id="upload_percents">0</span>%</p>'); else $('#upload_status').html('Wczytywanie: <span id="upload_percents">0</span>%'); }) .on('lu:progress', function(e, percentage) { $('#upload_percents').html(percentage); }) .on('lu:errors', function(e, errors) { $('#upload_status').html('Wystąpił błąd'); }) .on('lu:success', function(e, response) { response = JSON.parse(response); if(response == 'ok') $('#upload_status').html('Zakończono sukcesem'); else $('#upload_status').html('Wystąpił błąd'); }); });
Po wybraniu pliku i kliknięciu przycisku obok powinno się rozpocząć proces wczytywania na serwer. Poniżej pojawi się komunikat:
Wczytywanie: 0%
który będzie się zmieniał w trakcie operacji. Niestety, nie będzie to zauważalne przy małych plikach, przy których praktycznie automatycznie pojawi się komunikat Zakończono sukcesem lub Wystąpił błąd.
Po analizie kodu, jeśli macie większą wiedzę w zakresie jQuery i CSS to na pewno uda Wam się przygotować jakiś loader graficzny obrazujący postęp przy przesyłaniu.
Zachęcam do przejrzenia dokumentacji i przetestowania m.in. przesyłania dodatkowych zmiennych wraz z plikiem przez POST czy zaawansowanej obsłudze komunikatów błędów.
13:01 “Se on puuhöylä” Tällä kertaa se oli todella puuhöylä.
my site Residence hall
Residence hall ostatnio opublikował Residence hall
You ought to only entrust the job of i – Phone repair to expert organizations only.
Draped in certainly one of these amazingly created artistic cases, your i – Phone won’t only look fantastic but also shielded from damage.
Remote phone spy scams: Unfortunately, there is a huge number of web sites out there advertising remote mobile tracking software programs.
Billie ostatnio opublikował Billie
A gdyby tak podsunąć to rozwiązanie do teamu WordPress? Zdarzają się przypadki, że wysyłanie obrazków bywa jeszcze czasami uciążliwe. Szczególnie w momencie kiedy zmieniasz typ wysyłania załączników.
Edmund X ostatnio opublikował Kiedy wezwaÄ pomoc drogowÄ ?
Witam muszę przyznać, że bardzo fajna sprawa z tym uploadem plików bez przeładowywania strony. Ajaxa jeszcze nie miałem okazji wypróbować podobnie jak html 5. Właśnie powoli zaczynam się brać za upload plików i te informacje mi się z pewnością przydadzą dzięki.
super skrypt. dzieki
Dzięki wielki za ten spis bo od zawsze miałem z tym problem a nawet teraz do wp 4.0 dodali ponoć takie ładowanie ale nie działa jak należy a to rozwiązanie od ciebie działa i jest spoko.
maszynki ostatnio opublikował Gillette Fusion Proglide najnowsza seria systemowa potentata
Ja dopiero wchodzę w świat htmla, html…jestem po roku programowania w szkole policealnej. Wiem, że poziom raczej na pewno nie dorówna uniwersyteckiemu, ale staram się w każdy możliwy sposób poszerzać swoją wiedzę, dlatego zaglądam do Ciebie.
Nie ma jak to usprawnianie życia strony. Powyższy skrypt spełnia moje oczekiwania.
Dzięki za skrypt – przetestowałem na swoich stronach i działa.
Wojciech Rudzki | spółka z o.o. ostatnio opublikował Kiedy członkowie zarządu odpowiadaja za długi spółki z ograniczoną odpowiedzialnością?
Przetestowałem przed chwilą i wszystko działa, oby więcej takich porad.
Ciekawe wpisy. Czekam na jakieś nowinki z HTML5.
Czy ktoś może potwierdzić ten sposób na multiupload? Zastanawiam się nad skutecznym sposobem i poszukuję trochę w sieci na ten temat ale niestety lub stety ten artykuł jest pierwszy, który przekazuje konkretne informacje.
Justyna ostatnio opublikował Rak Jelita Grubego
Bardzo interesujący artykuł. Zapraszam wszystkich zainteresowanych tematami migracji na blog poświęcony wybywania za granicę swojego kraju.
Rzeczywiście skrypcik chodzi za …. zarąbiście !!!!
Twój Raj ostatnio opublikował Plaża nad Zalewem Siemianówka
Testowałem przed chwilą skrypcik i wszystko śmiga jak ta lala, dzięki! 🙂
Ciekawy artykuł. Poszukuję metody do doładowywania dużo ważących stron w miarę przewijania suwaka. Może to będzie dobre rozwiązanie?
Monika Puczyńska ostatnio opublikował m3p – pogotowie komputerowe – Wrocław, strony WWW, wirtualne albumy
Nie, tutaj chodzi o wgrywanie pliku przez użytkownika na stronę. Do tego co opisane wyżej, potrzebne będzie wczytywanie postów przez AJAX przy przewijaniu strony.
Testowane, skrypcik działa rewelacyjnie! Wielkie dzięki za skrypt! Co do Twojego pytania @karolek działa to tak jak opisał Filip.
Michał ostatnio opublikował Renta rodzinna – komu przysługuje, ile wynosi renta rodzinna
Dzięki za skrypt i opis. wszystko śmiga aż buczy 🙂 pzdr
Ciekawy i bardzo konkretny przykład.
Przetestuję go w najbliższej przyszłości.
Dziękuję i pozdrawiam.
igor ostatnio opublikował ALMOST – muzyka relaksacyjna MP3
a czy dzięki temu skryptowi mogę zaznaczyć kilkanaście plików czy muszę pojedynczo wrzucać?
karolek ostatnio opublikował Jak prawidłowo czyścić sierść konia?
W sumie muszę przyznać, że nie testowałem, ale skoro informacje o uploadowanym pliku przesyłane są jako element tablicy, to być może wystarczy dodać do pola upload multiple – http://www.w3schools.com/tags/att_input_multiple.asp