Sử dụng HTML5 / JavaScript để tạo và lưu tệp


317

Gần đây tôi đã chơi với WebGL và đã có một trình đọc Collada hoạt động. Vấn đề là nó khá chậm (Collada là một định dạng rất dài), vì vậy tôi sẽ bắt đầu chuyển đổi các tệp sang định dạng dễ sử dụng hơn (có thể là JSON). Tôi đã có mã để phân tích tệp trong JavaScript, vì vậy tôi cũng có thể sử dụng nó làm nhà xuất khẩu của mình! Vấn đề là tiết kiệm.

Bây giờ, tôi biết rằng tôi có thể phân tích cú pháp tệp, gửi kết quả đến máy chủ và yêu cầu trình duyệt quay lại tệp từ máy chủ dưới dạng tải xuống. Nhưng trong thực tế, máy chủ không liên quan gì đến quá trình đặc biệt này, vậy tại sao nó lại liên quan? Tôi đã có nội dung của tập tin mong muốn trong bộ nhớ. Có cách nào để tôi có thể trình bày cho người dùng tải xuống bằng JavaScript thuần không? (Tôi nghi ngờ điều đó, nhưng cũng có thể hỏi ...)

Và để rõ ràng: Tôi không cố gắng truy cập hệ thống tập tin mà không có kiến ​​thức của người dùng! Người dùng sẽ cung cấp một tệp (có thể thông qua kéo và thả), tập lệnh sẽ chuyển đổi tệp trong bộ nhớ và người dùng sẽ được nhắc tải xuống kết quả. Tất cả trong số đó phải là các hoạt động "an toàn" khi có liên quan đến trình duyệt.

[EDIT]: Tôi đã không đề cập đến nó trước, vì vậy những người đăng bài trả lời "Flash" là đủ hợp lệ, nhưng một phần trong những gì tôi đang làm là cố gắng làm nổi bật những gì có thể được thực hiện với HTML5 thuần túy ... vì vậy Flash là ngay trong trường hợp của tôi. (Mặc dù đó là một câu trả lời hoàn toàn hợp lệ cho bất kỳ ai làm một ứng dụng web "thực sự".) Đó là trường hợp có vẻ như tôi không gặp may trừ khi tôi muốn liên quan đến máy chủ. Dẫu sao cũng xin cảm ơn!


8
Bạn có thể xem xét thay đổi câu trả lời được chấp nhận, dường như bây giờ có một cách hoàn toàn bằng HTML
Pekka

Câu trả lời:


256

OK, tạo dữ liệu: URI chắc chắn thực hiện thủ thuật cho tôi, nhờ Matthew và Dennkster chỉ ra tùy chọn đó! Về cơ bản đây là cách tôi làm:

1) lấy tất cả nội dung thành một chuỗi gọi là "nội dung" (ví dụ: bằng cách tạo nội dung đó ban đầu hoặc bằng cách đọc InternalHTML của thẻ của một trang đã được xây dựng).

2) Xây dựng URI dữ liệu:

uriContent = "data:application/octet-stream," + encodeURIComponent(content);

Sẽ có giới hạn độ dài tùy thuộc vào loại trình duyệt, v.v., nhưng ví dụ Firefox 3.6.12 hoạt động cho đến ít nhất 256k. Mã hóa trong Base64 thay vì sử dụng encodeURIComponent có thể giúp mọi thứ hiệu quả hơn, nhưng đối với tôi điều đó là ổn.

3) mở một cửa sổ mới và "chuyển hướng" nó tới lời nhắc URI này để biết vị trí tải xuống của trang JavaScript được tạo của tôi:

newWindow = window.open(uriContent, 'neuesDokument');

Đó là nó.


34
Nếu bạn muốn tránh sử dụng cửa sổ bật lên, có thể bị chặn, bạn có thể đặt location.hrefnội dung. location.href = uriContent.
Alex Turpin

12
Xin chào, tôi đã thử nhưng nó tải tệp dưới dạng tệp .part. Làm thế nào tôi có thể thiết lập filetype?
Sedat Başar

6
@ SedatBaşar Dữ liệu URI không hỗ trợ đặt tên tệp, bạn phải dựa vào trình duyệt cài đặt tiện ích mở rộng phù hợp bằng cách sử dụng loại mime. Nhưng nếu loại mime có thể được trình duyệt hiển thị, nó sẽ không tải xuống, nhưng nó sẽ hiển thị nó. Có một số cách khác để làm điều này, nhưng không hoạt động trong IE <10.
panzi

7
IE không thực sự sopport dữ liệu URI và Firefox dường như lưu các tệp với một tên ngẫu nhiên.
nylund

25
Tôi nghĩ rằng chúng tôi đang làm điều này khó khăn hơn nó cần. Mở bảng điều khiển JS của bạn trên trang này và đặt nó location.href = "data:application/octet-stream," + encodeURIComponent(jQuery('#answer-4551467 .post-text').first().text());và nó sẽ lưu nội dung câu trả lời của @ Nøk vào một tệp. Tôi không có IE để kiểm tra nó, nhưng nó hoạt động cho webkit.
Bruno Bronosky

278

Giải pháp đơn giản cho các trình duyệt sẵn sàng HTML5 ...

function download(filename, text) {
    var pom = document.createElement('a');
    pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
    pom.setAttribute('download', filename);

    if (document.createEvent) {
        var event = document.createEvent('MouseEvents');
        event.initEvent('click', true, true);
        pom.dispatchEvent(event);
    }
    else {
        pom.click();
    }
}

Sử dụng

download('test.txt', 'Hello world!');

2
Nếu bạn biết url nguồn mà bạn muốn tải xuống thì đây là giải pháp tốt nhất!
sidonaldson

31
Khả năng đặt tên tệp làm cho điều này trở thành người chiến thắng.
Omn

9
Phương pháp này hoạt động trong Chrome cho đến bản cập nhật mới nhất mà tôi nhận được vài ngày trước (35.0.1916.114 m). Bây giờ nó hoạt động một phần trong đó tên tệp và phần mở rộng không còn hoạt động nữa (nó luôn đặt tên tệp download.txt bất kể điều gì được thông qua.)
Sevin7

6
Tôi có Chrom 42.0.2311.90 và điều này đang hoạt động với tôi với tên tệp dự kiến.
Saurabh Kumar

4
Nếu có giới hạn về số lượng dữ liệu có thể được bao gồm?
Kaspar Lee

80

HTML5 đã định nghĩa một window.saveAs(blob, filename)phương thức. Nó không được hỗ trợ bởi bất kỳ trình duyệt nào ngay bây giờ. Nhưng có một thư viện tương thích có tên FileSaver.js bổ sung chức năng này cho hầu hết các trình duyệt hiện đại (bao gồm cả Internet Explorer 10+). Internet Explorer 10 hỗ trợ một navigator.msSaveBlob(blob, filename)phương thức ( MSDN ), được sử dụng trong FileSaver.js để hỗ trợ Internet Explorer.

Tôi đã viết một bài đăng blog với nhiều chi tiết hơn về vấn đề này.


1
Còn chặn quảng cáo thì sao? Hành vi của thư viện này giống với giải pháp của @ Nøk. Văn bản thuần túy trong Firefox được mở mới. Chỉ Chrome cố lưu nó, nhưng nó thay đổi tiện ích mở rộng (tôi cần một dotfile không có tiện ích mở rộng).
ciembor

1
@ciembor biến thể thuộc tính tải xuống (url đối tượng +) (mà tôi sử dụng với chrome) cho phép bạn đặt tên tệp. Nó hoạt động cho tôi trong chrome.
panzi

1
@ciembor aha và một cửa sổ bật lên không bị chặn nếu một cú nhấp trực tiếp gây ra nó.
panzi

6
FileSaver.js hỗ trợ IE ngay bây giờ
Eli Gray

15
W3C nói: Làm việc trên tài liệu này đã bị ngưng và nó không nên được tham chiếu hoặc sử dụng làm cơ sở để thực hiện.
WaiKit Kung

48

Lưu tập tin lớn

URI dữ liệu dài có thể gây ra vấn đề về hiệu suất trong trình duyệt. Một tùy chọn khác để lưu các tệp được tạo ở phía máy khách, là đặt nội dung của chúng vào đối tượng Blob (hoặc Tệp) và tạo liên kết tải xuống bằng cách sử dụng URL.createObjectURL(blob). Điều này trả về một URL có thể được sử dụng để lấy nội dung của blob. Các blob được lưu trữ bên trong trình duyệt cho đến khi URL.revokeObjectURL()được gọi trên URL hoặc tài liệu đã tạo nó được đóng lại. Hầu hết các trình duyệt web đều hỗ trợ URL đối tượng , Opera Mini là trình duyệt duy nhất không hỗ trợ chúng.

Buộc tải xuống

Nếu dữ liệu là văn bản hoặc hình ảnh, trình duyệt có thể mở tệp, thay vì lưu nó vào đĩa. Để khiến tệp được tải xuống khi nhấp vào liên kết, bạn có thể sử dụng downloadthuộc tính. Tuy nhiên, không phải tất cả các trình duyệt web đều hỗ trợ thuộc tính tải xuống . Một tùy chọn khác là sử dụng application/octet-streamnhư loại mime của tệp, nhưng điều này làm cho tệp được hiển thị dưới dạng blob nhị phân, đặc biệt không thân thiện với người dùng nếu bạn không hoặc không thể chỉ định tên tệp. Xem thêm ' Buộc mở cửa sổ bật lên "Lưu dưới dạng ..." tại liên kết văn bản, nhấp vào pdf trong HTML '.

Chỉ định tên tệp

Nếu blob được tạo bằng Trình tạo tệp, bạn cũng có thể đặt tên tệp, nhưng chỉ một số trình duyệt web (bao gồm Chrome & Firefox) có hỗ trợ cho Trình tạo tệp . Tên tệp cũng có thể được chỉ định làm đối số chodownload thuộc tính, nhưng điều này phải chịu rất nhiều cân nhắc về bảo mật . Internet Explorer 10 và 11 cung cấp phương thức riêng của mình, msSaveBlob , để chỉ định tên tệp.

Mã ví dụ

var file;
var data = [];
data.push("This is a test\n");
data.push("Of creating a file\n");
data.push("In a browser\n");
var properties = {type: 'text/plain'}; // Specify the file's mime-type.
try {
  // Specify the filename using the File constructor, but ...
  file = new File(data, "file.txt", properties);
} catch (e) {
  // ... fall back to the Blob constructor if that isn't supported.
  file = new Blob(data, properties);
}
var url = URL.createObjectURL(file);
document.getElementById('link').href = url;
<a id="link" target="_blank" download="file.txt">Download</a>


1
Tôi có thể hiển thị hộp thoại (cửa sổ bật lên) để chỉ định thư mục (thư mục) để lưu tệp không?
Calvin

@Calvin: Tôi đã cập nhật câu trả lời để giải thích cách buộc tải xuống và cung cấp tên tệp. Đối với IE, tôi tin rằng bạn có thể sử dụng msSaveBlobđể mở hộp thoại "Lưu dưới dạng". Đối với các trình duyệt khác, tùy chọn duy nhất của bạn là chọn thủ công "Lưu dưới dạng" từ menu ngữ cảnh của liên kết tải xuống.
bcmpinc

1
@ Jek-fdrv: Chỉ các Blob-urls hoạt động trong Safari. Thuộc tính tải xuống và Trình tạo tệp không được Safari hỗ trợ, do đó bạn không thể buộc tải xuống, có nghĩa là blob có thể sẽ được mở trong chính trình duyệt và bạn không thể chỉ định tên tệp. Đối với ví dụ đã cho, bạn vẫn có thể tải xuống tệp bằng Safari bằng menu ngữ cảnh của liên kết.
bcmpinc


Đây là một câu trả lời rất hữu ích và nhiều thông tin. Một điều nữa có thể giúp những người như tôi: sau khi cài đặt document.getElementById('link').href = url;, mã của bạn có thể tiếp tục và kích hoạt liên kết bằng cách sử dụng .click()phương thức của phần tử .
LarsH

36
function download(content, filename, contentType)
{
    if(!contentType) contentType = 'application/octet-stream';
        var a = document.createElement('a');
        var blob = new Blob([content], {'type':contentType});
        a.href = window.URL.createObjectURL(blob);
        a.download = filename;
        a.click();
}

3
Tác dụng của nội dung là gì? Cái này được dùng để làm gì?
Uri

3
Công cụ này hoạt động tốt ngay cả trong Chrome mới nhất, không giống như câu trả lời của @ Matěj Pokorný. Cảm ơn.
Alexander Amelkin

2
Điều này không làm việc cho tôi trên FF36 hoặc IE11. Nếu tôi thay thế a.clickbằng mã sử dụng document.createEvent()như Matěj Pokorný đề xuất, nó hoạt động trên FF nhưng không hoạt động trên IE. Tôi chưa thử Chrome.
Peter Hull

25

Hãy xem Doug Neiner Downloadify , giao diện JavaScript dựa trên Flash để thực hiện việc này.

Downloadify là một thư viện JavaScript + Flash nhỏ cho phép tạo và lưu tệp nhanh chóng, trong trình duyệt mà không cần tương tác với máy chủ.


6
Đối với hầu hết mọi người, đây có lẽ là câu trả lời mà họ sẽ cần. Vì vậy, mặc dù nó không đáp ứng các yêu cầu cụ thể của tôi (như đã giải thích ở trên) tôi đánh dấu nó là câu trả lời được chấp nhận.
Toji

2
@Toji ah, tôi hiểu rồi. Có thể hỏi lại và cụm từ lại dưới HTML 5banner và tag phù hợp? Điều đó sẽ có khả năng thu hút những người dùng biết về lĩnh vực cụ thể đó (hiện tại vẫn là một đám đông tương đối nhỏ, tôi cho rằng). Tôi khá chắc chắn rằng nó có thể được thực hiện trong HTML 5 nhưng tôi không biết làm thế nào.
Pekka

1
Có các downloadify.info Downloadify miền được mua / chuyển nhượng, và nếu như vậy là có một vị trí mới? Các trang web hiện tại dường như hoàn toàn không liên quan đến câu trả lời được đưa ra.
Christos Hayward

17
Điều này không trả lời câu hỏi sử dụng HTML5 ... - có tiêu đề.
Ixx

5
@Ixx cũng công bằng, đã được thêm vào sau khi câu trả lời được đăng. Tuy nhiên, bạn đã đúng. Câu trả lời dưới đây nên được chấp nhận
Pekka

17

Giải pháp đơn giản!

<a download="My-FileName.txt" href="data:application/octet-stream,HELLO-WORLDDDDDDDD">Click here</a>

Hoạt động trong tất cả các trình duyệt hiện đại.


Xin chào, bạn có biết cách chỉ định hành vi thuộc tính "tải xuống" bằng window.open hoặc một hàm javascript khác không?
yucer

2
@yucer Không có thuộc tính tải xuống (hoặc bất kỳ thuộc tính nào cho vấn đề đó) với window.open(). Nó không liên quan. Bạn có thể sử dụng phương pháp này và buộc .click()nó vào nó, nhưng hãy xem thời gian vì Firefox không thích nó nếu bạn gọi .click()trước khi để phần tử gắn vào thân máy.
Brad

Nhưng đáng buồn là tất cả các không gian được xóa. Trong trường hợp của tôi, điều đó thực sự tồi tệ vì tôi muốn tải xuống mã nguồn cho tệp SVG.
frankenapps

không gian được giữ nguyên nếu bạn sử dụng encodeURIComponent (nội dung)
Mike Redcoat

không thể chọn tên trong firefox, nhưng chrome hoạt động
Bhikkhu Subhuti

10

Bạn có thể tạo URI dữ liệu . Tuy nhiên, có những hạn chế dành riêng cho trình duyệt.


1
Hay đấy. Tôi sẽ xem xét nó nhiều hơn khi tôi có cơ hội. Cảm ơn!
Toji

@quantumpotato, thực sự tạo URL là một mẹo nhỏ để giải thích. Tất cả các gritty nitty là trong RFC 2397 . Bạn có thể sử dụng các công cụ như thế này để thử nghiệm. Sau đó, đối với ứng dụng thực của bạn, bạn có thể tìm kiếm thư viện URI dữ liệu hoặc thư viện cơ sở 64 cho ngôn ngữ của mình. Nếu bạn không tìm thấy nó, vui lòng đặt câu hỏi tiếp theo. Một số hạn chế dành riêng cho trình duyệt được đưa ra trong bài viết Wikipedia . Ví dụ: IE giới hạn độ dài và loại (ví dụ: không phải văn bản / html).
Matthew Flaschen

Tạo URL dữ liệu không phải là khó khăn: "data:text/plain;charset=UTF-8,"+encodeURIComponent(text)Nhưng vâng, IE giới hạn kích thước của URL dữ liệu ở mức không thể sử dụng được và nó không hỗ trợ chúng cho những thứ như window.open(...)hoặc iframe (tôi nghĩ).
panzi

@panzi, nó cũng không dễ như vậy đâu. Đối với một điều, đó không phải là loại MIME phù hợp cho cả Collada hoặc JSON.
Matthew Flaschen

câu trả lời quá không thông tin. xin vui lòng, thêm các thông số kỹ thuật cho trình duyệt, nếu bạn đề cập đến chúng.
T.Todua

10

Tôi đã sử dụng FileSaver ( https://github.com/eligrey/FileSaver.js ) và nó hoạt động tốt.
Ví dụ, tôi đã thực hiện chức năng này để xuất nhật ký được hiển thị trên một trang.
Bạn phải vượt qua một mảng cho sự phát sinh của Blob, vì vậy tôi chỉ có thể không viết điều này đúng cách, nhưng nó hiệu quả với tôi.
Trong trường hợp, hãy cẩn thận với sự thay thế: đây là cú pháp để tạo ra toàn cầu này, nếu không nó sẽ chỉ thay thế cái đầu tiên anh ta gặp.

exportLogs : function(){
    var array = new Array();

    var str = $('#logs').html();
    array[0] = str.replace(/<br>/g, '\n\t');

    var blob = new Blob(array, {type: "text/plain;charset=utf-8"});
    saveAs(blob, "example.log");
}

2
FileSaver rất tuyệt, đây là IE Shim cho chức năng trước IE10 preIE10SaveAs: (tên tệp, filecontent, mimetype) {var w = window.open (); var doc = w.document; doc.open (mimetype, 'thay thế'); doc.charset = "utf-8"; doc.write (filecontent); doc.c Đóng (); doc.execCommand ("SaveAs", null, tên tệp); }
aqm

Một cảnh báo về shim của @ aqm: Nó thực thi các thẻ script.
GameFreak

Ngoài ra, có thể nên đặt w.close();sauexecCommand
GameFreak

8

Tôi tìm thấy hai cách tiếp cận đơn giản phù hợp với tôi. Đầu tiên, sử dụng một ayếu tố đã được nhấp và tiêm dữ liệu tải xuống. Và thứ hai, tạo một aphần tử với dữ liệu tải xuống, thực thi a.click()và xóa nó một lần nữa. Nhưng cách tiếp cận thứ hai chỉ hoạt động nếu được gọi bởi hành động nhấp chuột của người dùng. (Một số) Khối trình duyệt click()từ các bối cảnh khác như khi tải hoặc kích hoạt sau khi hết thời gian (setTimeout).

<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="UTF-8">
    <script type="text/javascript">
      function linkDownload(a, filename, content) {
        contentType =  'data:application/octet-stream,';
        uriContent = contentType + encodeURIComponent(content);
        a.setAttribute('href', uriContent);
        a.setAttribute('download', filename);
      }
      function download(filename, content) {
        var a = document.createElement('a');
        linkDownload(a, filename, content);
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
      }
    </script>
   </head>
  <body>
    <a href="#" onclick="linkDownload(this, 'test.txt', 'Hello World!');">download</a>
    <button onclick="download('test.txt', 'Hello World!');">download</button>
  </body>
</html>

2
Bạn cũng có thể chèn atài liệu vào (có thể bằng "display:none"), nhấp vào nó và sau đó xóa nó.
Teepeemm

1
điều này có hoạt động trong các trình duyệt mà thuộc tính tải xuống không được hỗ trợ như ngay cả hiện đại và safari .. caniuse.com/#feat=doad
Muhammad Umer

1
Chỉ cần thử nghiệm Safari 5.0 dưới rượu vang. Phiên bản đầu tiên hoạt động, phiên bản thứ hai thì không. Tôi cũng đã thử nghiệm IE 8 (rượu vang) và nó không hoạt động.
maikel

6

Đây là một liên kết đến phương pháp URI dữ liệu mà Mathew đã đề xuất, nó hoạt động trên safari, nhưng không tốt vì tôi không thể đặt filetype, nó được lưu thành "không xác định" và sau đó tôi phải quay lại đó và thay đổi nó theo thứ tự để xem tập tin ...

http://www.nihilogic.dk/labs/canvas2image/


4

Bạn có thể sử dụng localStorage. Đây là tương đương Html5 của cookie. Nó dường như hoạt động trên Chrome và Firefox NHƯNG trên Firefox, tôi cần tải nó lên máy chủ. Đó là, thử nghiệm trực tiếp trên máy tính ở nhà của tôi không hoạt động.

Tôi đang làm việc với các ví dụ HTML5. Tới http://faculty.purchase.edu/jeanine.meyer/html5/html5explain.html và di chuyển đến một mê cung. Thông tin để xây dựng lại mê cung được lưu trữ bằng localStorage.

Tôi đã đến bài viết này để tìm kiếm HTML5 JavaScript để tải và làm việc với các tệp xml. Có giống với html và JavaScript cũ hơn không ????


4

thử

let a = document.createElement('a');
a.href = "data:application/octet-stream,"+encodeURIComponent('"My DATA"');
a.download = 'myFile.json';
a.click(); // we not add 'a' to DOM so no need to remove

Nếu bạn muốn tải xuống dữ liệu nhị phân, hãy xem tại đây

Cập nhật

2020,06,14 Tôi nâng cấp Chrome lên 83.0 trở lên, dừng đoạn trích SO (do hạn chế bảo mật hộp cát ) - nhưng phiên bản JSFiddle hoạt động - tại đây


3

Như đã đề cập trước đây về API tệp , cùng với API FileWriterFileSystem có thể được sử dụng để lưu trữ tệp trên máy của khách hàng từ ngữ cảnh của tab / cửa sổ trình duyệt.

Tuy nhiên, có một số điều liên quan đến hai API sau mà bạn cần biết:

  • Việc triển khai API hiện chỉ tồn tại trong các trình duyệt dựa trên Chromium (Chrome & Opera)
  • Cả hai API đã được gỡ khỏi theo dõi tiêu chuẩn W3C vào ngày 24 tháng 4 năm 2014 và cho đến nay là độc quyền
  • Việc loại bỏ các API (hiện là độc quyền) khỏi các trình duyệt triển khai trong tương lai là một khả năng
  • Một hộp cát (một vị trí trên đĩa bên ngoài các tệp có thể không tạo ra hiệu ứng) được sử dụng để lưu trữ các tệp được tạo bằng API
  • Một hệ thống tệp ảo (cấu trúc thư mục không nhất thiết tồn tại trên đĩa ở dạng tương tự như khi truy cập từ trong trình duyệt) được sử dụng đại diện cho các tệp được tạo bằng API

Dưới đây là các ví dụ đơn giản về cách các API được sử dụng, trực tiếp và gián tiếp, song song để thực hiện việc này:

Bánh nướng *

bakedGoods.get({
        data: ["testFile"],
        storageTypes: ["fileSystem"],
        options: {fileSystem:{storageType: Window.PERSISTENT}},
        complete: function(resultDataObj, byStorageTypeErrorObj){}
});

Sử dụng API tệp, FileWriter và FileSystem thô

function onQuotaRequestSuccess(grantedQuota)
{

    function saveFile(directoryEntry)
    {

        function createFileWriter(fileEntry)
        {

            function write(fileWriter)
            {
                var dataBlob = new Blob(["Hello world!"], {type: "text/plain"});
                fileWriter.write(dataBlob);              
            }

            fileEntry.createWriter(write);
        }

        directoryEntry.getFile(
            "testFile", 
            {create: true, exclusive: true},
            createFileWriter
        );
    }

    requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile);
}

var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);

Mặc dù API FileSystem và FileWriter không còn trên đường chuẩn, nhưng theo tôi, việc sử dụng chúng có thể được biện minh trong một số trường hợp, bởi vì:

  • Sự quan tâm mới từ các nhà cung cấp trình duyệt không triển khai có thể đặt họ lại ngay trên đó
  • Tỷ lệ thâm nhập thị trường của các trình duyệt triển khai (dựa trên Chromium) cao
  • Google (người đóng góp chính cho Chromium) đã không đưa ra và ngày kết thúc cho các API

Tuy nhiên, "một số trường hợp" có bao gồm chính bạn hay không, là do bạn quyết định.

* Bakedoods được duy trì bởi không ai khác ngoài anh chàng này ngay tại đây :)


2

Chuỗi này là vô giá để tìm ra cách tạo tệp nhị phân và lời nhắc tải xuống tệp đã đặt tên, tất cả trong mã máy khách mà không cần máy chủ.

Bước đầu tiên đối với tôi là tạo blob nhị phân từ dữ liệu mà tôi đang lưu. Có rất nhiều mẫu để thực hiện điều này cho một loại nhị phân duy nhất, trong trường hợp của tôi, tôi có một định dạng nhị phân với nhiều loại mà bạn có thể chuyển qua dưới dạng một mảng để tạo blob.

saveAnimation: function() {

    var device = this.Device;
    var maxRow = ChromaAnimation.getMaxRow(device);
    var maxColumn = ChromaAnimation.getMaxColumn(device);
    var frames = this.Frames;
    var frameCount = frames.length;

    var writeArrays = [];


    var writeArray = new Uint32Array(1);
    var version = 1;
    writeArray[0] = version;
    writeArrays.push(writeArray.buffer);
    //console.log('version:', version);


    var writeArray = new Uint8Array(1);
    var deviceType = this.DeviceType;
    writeArray[0] = deviceType;
    writeArrays.push(writeArray.buffer);
    //console.log('deviceType:', deviceType);


    var writeArray = new Uint8Array(1);
    writeArray[0] = device;
    writeArrays.push(writeArray.buffer);
    //console.log('device:', device);


    var writeArray = new Uint32Array(1);
    writeArray[0] = frameCount;
    writeArrays.push(writeArray.buffer);
    //console.log('frameCount:', frameCount);

    for (var index = 0; index < frameCount; ++index) {

      var frame = frames[index];

      var writeArray = new Float32Array(1);
      var duration = frame.Duration;
      if (duration < 0.033) {
        duration = 0.033;
      }
      writeArray[0] = duration;
      writeArrays.push(writeArray.buffer);

      //console.log('Frame', index, 'duration', duration);

      var writeArray = new Uint32Array(maxRow * maxColumn);
      for (var i = 0; i < maxRow; ++i) {
        for (var j = 0; j < maxColumn; ++j) {
          var color = frame.Colors[i][j];
          writeArray[i * maxColumn + j] = color;
        }
      }
      writeArrays.push(writeArray.buffer);
    }

    var blob = new Blob(writeArrays, {type: 'application/octet-stream'});

    return blob;
}

Bước tiếp theo là làm cho trình duyệt nhắc người dùng tải xuống blob này với tên được xác định trước.

Tất cả những gì tôi cần là một liên kết có tên tôi đã thêm vào HTML5 mà tôi có thể sử dụng lại để đổi tên tập tin ban đầu. Tôi đã giấu nó vì liên kết không cần hiển thị.

<a id="lnkDownload" style="display: none" download="client.chroma" href="" target="_blank"></a>

Bước cuối cùng là nhắc người dùng tải tập tin.

var data = animation.saveAnimation();
var uriContent = URL.createObjectURL(data);
var lnkDownload = document.getElementById('lnkDownload');
lnkDownload.download = 'theDefaultFileName.extension';
lnkDownload.href = uriContent;
lnkDownload.click();

1

Đây là một hướng dẫn để xuất các tệp dưới dạng ZIP:

Trước khi bắt đầu, có một thư viện để lưu tệp, tên của thư viện là fileSaver.js, Bạn có thể tìm thấy thư viện này ở đây. Bây giờ, hãy bắt đầu, bao gồm các thư viện cần thiết:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.4/jszip.min.js"  type="text/javascript"></script>
<script type="text/javascript" src="https://fastcdn.org/FileSaver.js/1.1.20151003/FileSaver.js" ></script>

Bây giờ sao chép mã này và mã này sẽ tải xuống tệp zip với tệp hello.txt có nội dung Hello World. Nếu mọi thứ hoạt động tốt, điều này sẽ tải xuống một tập tin.

<script type="text/javascript">
    var zip = new JSZip();
    zip.file("Hello.txt", "Hello World\n");
    zip.generateAsync({type:"blob"})
    .then(function(content) {
        // see FileSaver.js
        saveAs(content, "file.zip");
    });
</script>

Điều này sẽ tải xuống một tập tin gọi là file.zip. Bạn có thể đọc thêm tại đây: http://www.wapgee.com/story/248/guide-to-create-zip-files-USE-javascript-by-USE-jszip-l Library

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.