2013-05-02 8 views
24

Przeczytałem kilka starszych wątków o tym samym, ale ostatnio interfejs API pliku znacznie się zmienił. Moim wymaganiem jest zapisanie pliku json (dane są lokalnie w indexdDB, ale potrzebuję sposobu na utworzenie kopii zapasowej). Odkąd używam indexdDB, wybieram tylko ostatnie przeglądarki, głównie chrome. Czy możliwe jest zapisanie danych (ciąg jsonów) na komputerze klienckim?Zapisz ciąg jsonów na komputerze klienckim (przy użyciu interfejsu API HTML5)

Widziałem http://eligrey.com/demos/FileSaver.js/, ale czy istnieje sposób, aby to zrobić natywnie?

Dzięki.

Odpowiedz

55

Można użyć Blob i funkcji HTML5 a[download] aby zapewnić pobieranie kopii zapasowej JSON:

var data = {a:1, b:2, c:3}; 
var json = JSON.stringify(data); 
var blob = new Blob([json], {type: "application/json"}); 
var url = URL.createObjectURL(blob); 

var a = document.createElement('a'); 
a.download = "backup.json"; 
a.href  = url; 
a.textContent = "Download backup.json"; 

Oto jsfiddle przykład: http://jsfiddle.net/potatosalad/yuM2N/

+0

+1 świetny !! czy istnieje sposób na zapisanie go za pomocą przycisku "Zapisz jako". Byłoby idealnie, gdyby nie iść na powyższe. Dzięki. – bsr

+1

Możesz zajrzeć do czegoś w stylu [Downloadify] (https://github.com/dcneiner/Downloadify). Z tego co wiem obecnie, nie ma prostego sposobu na przeglądarkę javascript w różnych przeglądarkach, aby wymusić wyświetlanie okna "Zapisz jako". Zobacz http://stackoverflow.com/questions/2897619/using-html5-javascript-to-generate-and-save-a-file, aby uzyskać więcej informacji. – potatosalad

4

Tak, możesz. Zakłada się, że masz json w text:

var toDownload=new Blob([text],{type:'x-whatever/x-backup'}); 
var link=window.URL.createObjectURL(toDownload); 
window.location=link; 

który jest niesprawdzone, ale powinno działać.

+0

to prawie działa, ale nie pozwoli mi zapisać zawartość w nowym oknie to wyprowadza zbyt ... mogę wybrać tylko outputted treści, skopiować i wkleić w innym miejscu, jakiś pomysł jak mogę czy rzeczywiście można zapisać wynik? – skplunkerin

3

podstawie potatosalad answer i eksperymentował z 'ja' aktualizacją Link:
jsfiddle

function saveAsFile(link, content, filename) { 
    var blob = new Blob([content], {type: "text/text"}); 
    var url = URL.createObjectURL(blob); 

    // update link to new 'url' 
    link.download = filename + ".txt"; 
    link.href  = url; 
} 

saveAsFile(this, "YourContent", "HelloWorldFile"); 

funkcja potrzebuje wywołującego elementu a jako pierwszego argumentu.
niż aktualizuje cel href do nowego obiektu typu blob.

1

Można użyć FileSaver.js.

Przykładowy kod:

//include the js file in html. 
<script src="FileSaver.min.js"></script>  

// other code ... 

//use it here. 
var myjson= "{a:3, b:4}"; 
var blob = new Blob([myjson], {type: "application/json"}); 

var saveAs = window.saveAs; 
saveAs(blob, "my_outfile.json"); 

Zastosowanie JSON.stringify aby utworzyć ciąg z JSON.

Fiddle: https://jsfiddle.net/9w9ofec4/3/

+0

Ta odpowiedź nie odpowiada na pytanie ... Opis pytania stwierdza, że ​​widział FileSaver, ale chce natywnego rozwiązania. Przepraszamy plik bro – skplunkerin

+0

Rozwiązanie FileSaver faktycznie wykorzystuje api HTML5, gdy jest dostępne, a dla starszej przeglądarki działa dobrze, co jest lepsze niż zwykły HTML5. Tak więc, prawdopodobnie należy powiedzieć, że tak, oczywiście, jest na to kod, ale po co zawracać sobie głowę, gdy kod zawodzi w wielu przeglądarkach, więc lepiej korzystaj z dobrej biblioteki. –

Powiązane problemy