Siedziałem sobie niedawno w Zamkowych Tarasach z waniliowym latte w kubku i Macbookiem przed sobą. Kawa nie była ze Starbucksa, bo go nie ma jeszcze w Lublinie, ale Mac był jak najbardziej Applowski. Miałem potrzebę wysłać tu na bloga kilka zdjęć. Skorzystałem więc ze swojego multiuploadera i... dupa. Nie działał. Jak to się mogło stać?
Od dawna rozwijam autorski Alib CyMeS. Jakiś rok temu zrezygnowałem z flashowego multiuploadera na rzecz JavaScriptowego wykorzystującego technologię HTML5 i AJAX. Wiadomo, Flash w internecie jest już przeżytkiem. Urządzenia mobilne go nie wspierają, Apple też się wypiął a i windowsowe przeglądarki robią coraz więcej problemów. Na szczęście HTML5 już dawno jest standardem i jeśli ktoś używa przestarzałego MSIE to na własne ryzyko.
Poczytałem trochę o wysyłaniu plików Ajaxem i wszędzie jednogłośnie zalecano używanie obiektu FormData.
Jak to zrobić?
No i super. Oprogramowałem, sprawdziłem czy działa i zapomniałem o temacie.
No i właśnie niedawno próbuję tego użyć na Macbooku i dupa. Próbuje drugi raz i znowu bez skutku. Jako że akurat jestem w trakcie solidnej rozbudowy CMS-a, pomyślałem, że coś w międzyczasie zepsułem. Ale po powrocie do domu odpalam PC, Firefoxa i... ojejku, jakie zdziwienie! Wszystko działa poprawnie!
Uuu... - pomyślałem - jakaś grubsza sprawa.
Zacząłem szukać więcej informacji o obiekcie FormData i okazuje się, że Safari wspiera ten obiekt tylko na bardzo podstawowym poziomie, czyli metodę append(klucz,wartość). A ja używałem ich trochę więcej np. get() i set().
A podobno produkty Apple (nie tylko sprzęt) są takie nowoczesne i podobno zgodne z najnowszymi trendami...
Żeby oddać sprawiedliwość, MSIE również nie obsługuje w pełni FormData, ale tu akurat problemu większego nie ma. W ta przeglądarka służy przede wszystkim do pobrania Firefoxa :)
Kolejne dwa dni kombinowałem, jak ten problem rozwiązać. Nie było łatwo, internet uparcie trzymał się FormData. Na szczęście wytrwałość w poszukiwaniach popłaciła. Znalazłem „zastępcze” prototypy a nawet jeden płatny plugin.
Niespecjalnie lubię korzystać z gotowców, zazwyczaj okazuje się, że ze względu na swoją uniwersalność, są zbyt „przegadane”. Tak samo było i tym razem. Prawie 20kB kodu udało mi się skrócić do kilkunastu linijek.
W skrócie trzeba zrobić tak:
To tak w skrócie. Pewnie opisałem to niezbyt klarownie, bo nie jestem teoretykiem programowania i nie znam tych wszystkich mądrych pojęć, którymi się posługujesz. Ale myślę, że wystarczy to jako punkt zaczepienia do dalszych poszukiwań, jeśli będzie Ci to potrzebne. W każdym razie zamiast bólu głowy mam kawałek dobrze działającego kodu.
Jeśli więc programujesz internety, to pamiętaj, że nie tylko MSIE lubi mijać się ze standardami. Najbardziej popularna przeglądarka na urządzenia od Apple również.