To taka dla mnie nowość, może dla was nie. Ostatnio w trakcie jednego projektu, jedno wymaganie mówiło o tym, ze użytkownik powinien móc ściągnąć dane prezentowane w tabelce jako csv. Jako, że to była aplikacja napisana w JavaScript a do API nie mieliśmy dostępu, trzeba było znaleźć rozwiązanie problemu. Na szczęście na pomoc przyszedł nam sam JavaScript i obiekt typu Blob
.
Obiekt, który jak się okazało istnieje już od jakiegoś czasu a jakoś nigdy na niego nie natrafiłem. Całość jest banalnie prosta w użyciu wystarczy podać jako pierwszy argument tablicę danych do zapisania, a jako drugi ustalić typ danych:
var blob = new Blob(['1,2,3,Something Test'], {type: 'text/csv'});
Następnie tak stworzony obiekt możemy na dwa sposoby zapisać (dwa, zależy od przeglądarki oczywiście). Jeżeli mamy IE to możemy wykonać kod wywołujący msSaveBlob
albo msSaveOrOpenBlob
. Różnica polega na tym czy będziemy próbować otworzyć plik czy też nie.
var saveBlob = window.navigator.msSaveBlob; if (saveBlob) { saveBlob(blob, "filename.csv"); }
Jeżeli zaś nie mamy IE, to:
var a = window.document.createElement("a"); // zwróci coś podobnego do: blob:c64d02ec-14e0-41cf-8784-72bcd9ea9af7 zostanie zwrócone a.href = window.URL.createObjectURL(blob); // https://developer.mozilla.org/en/docs/Web/HTML/Element/a#Attributes a.download = 'filename.csv'; document.body.appendChild(a); a.click(); document.body.removeChild(a);
Kod już nie jest tak przyjemny, ale działa. Nie ma w nim nic trudnego, po prostu tworzymy linka i klikamy na niego. Warto zwrócić uwagę na atrybut HTML5 – download
, który powoduje, ze przeglądarka nie stara się otworzyć linku a jedynie pobrać jego zawartość.
W ten o to prosty sposób można zapisać prawie każdy plik z poziomu przeglądarki – fajny i przyjazny sposób. Znaliście go? :)
My korzystaliśmy jeszcze z biblioteki https://github.com/eligrey/FileSaver.js/ żeby było większe wsparcie przeglądarek i wspólny interfejs.
O, dzieki :) jak będziemy potrzebować czegoś bardziej zaawansowanego to skorzystamy :)
Trzeba uważać na te biblioteki. Ta biblioteka: https://github.com/alferov/angular-file-saver nagle przestała sobie radzić na iOS. Straciliśmy dość dużo czasu żeby przepisać funkcjonalność. Nic nie działa tak pewnie jak zwykły request ze zwracanym application/octet-stream’em :)
Gutek, jak zawsze krótko i treściwie. To najbardziej cenię w Twoim blogu. Nie trzeba się przedzierać przez akapity wywodów :)
Comments are closed.