2013-05-02 36 views
24

Tôi đọc một vài chuỗi cũ hơn về cùng, nhưng thấy API tệp đã thay đổi rất nhiều trong thời gian gần đây. Yêu cầu của tôi là để lưu một tập tin json (dữ liệu là cục bộ trong indexdDB, nhưng tôi cần một cách để sao lưu nó). Vì tôi sử dụng indexdDB, tôi chỉ nhắm mục tiêu các trình duyệt gần đây, chủ yếu là chrome. Vì vậy, nó có thể lưu dữ liệu (chuỗi json) vào máy tính của khách hàng?Lưu chuỗi json vào máy khách (sử dụng API HTML5)

Tôi đã xem http://eligrey.com/demos/FileSaver.js/, nhưng có cách nào để làm điều đó một cách tự nhiên không?

Cảm ơn.

Trả lời

55

Bạn có thể sử dụng một Blob và tính năng HTML5 a[download] để cung cấp một tải về JSON sao lưu:

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"; 

Dưới đây là một ví dụ jsfiddle: http://jsfiddle.net/potatosalad/yuM2N/

+0

+1 tuyệt vời !! có cách nào để lưu thông qua nút "Lưu dưới dạng" không. Nó sẽ là lý tưởng, nếu không tôi sẽ đi cho ở trên. Cảm ơn. – bsr

+1

Bạn có thể muốn xem nội dung như [Downloadify] (https://github.com/dcneiner/Downloadify). Từ những gì tôi có thể cho biết hiện tại, không có cách nào để chạy qua trình duyệt chéo để buộc hộp thoại "Lưu dưới dạng" hiển thị. Xem http://stackoverflow.com/questions/2897619/using-html5-javascript-to-generate-and-save-a-file để biết thêm thông tin. – potatosalad

4

Có, bạn có thể. Điều này giả định rằng bạn có json trong text:

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

chưa được kiểm tra, nhưng nó sẽ hoạt động.

+0

này hầu hết các công trình nhưng sẽ không cho phép tôi để lưu nội dung trong cửa sổ mới này kết quả đầu ra quá ... Tôi chỉ có thể chọn nội dung outputted, sao chép và dán ở những nơi khác, bất kỳ ý tưởng làm thế nào tôi thực sự có thể lưu đầu ra không? – skplunkerin

3

dựa trên potatosalad answer tôi đã thử nghiệm với một 'tự' cập nhật liên kết:
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"); 

chức năng saveAsFile() cần phần tử gọi a làm đối số đầu tiên.
thay vì cập nhật mục tiêu href thành đốm màu mới.

1

Bạn có thể sử dụng FileSaver.js.

Mẫu mã:

//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"); 

Sử dụng JSON.stringify để tạo ra một chuỗi từ JSON.

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

+0

Câu trả lời này không trả lời được câu hỏi ... Mô tả câu hỏi nói rằng anh ta đã thấy FileSaver nhưng muốn có một giải pháp gốc. Xin lỗi bro – skplunkerin

+0

Các giải pháp FileSaver thực sự sử dụng HTML5 api khi có sẵn, và cho trình duyệt cũ nó chỉ hoạt động tốt, đó là tốt hơn so với sử dụng đồng bằng HTML5. Vì vậy, có lẽ người ta nên nói, rằng có tất nhiên có mã cho điều đó, nhưng tại sao phải bận tâm, khi mã sẽ thất bại trong nhiều trình duyệt, vì vậy tốt hơn sử dụng thư viện tốt. –

Các vấn đề liên quan