2011-10-10 44 views
32

Tôi đang làm việc trên trình soạn thảo văn bản bằng Javascript thuần túy. Tôi muốn nó để khi người dùng nhấp vào nút 'Lưu', trình chỉnh sửa sẽ tải xuống tệp. Tôi đã làm việc này một phần:Lưu tập tin Javascript với tên tập tin

uriContent = "data:application/octet-stream," + encodeURIComponent(codeMirror.getValue()); 
newWindow=window.open(uriContent, 'filename.txt'); 

Tải tệp xuống, nhưng vấn đề là tệp có tên 'tải xuống'.

Câu hỏi: Làm cách nào để thay đổi tên của tệp thành bất kỳ thứ gì tôi muốn, ví dụ: filename.txt?

+0

@zzzzBov Tôi nghĩ câu trả lời này tốt hơn câu trả lời bạn liên kết bởi vì nó thực sự cho thấy một giải pháp cho vấn đề đã nêu. – Deviljho

+0

@ AdriánSalgado, điều đó không làm cho câu hỏi này ít bị trùng lặp hơn, tuy nhiên cuộc bỏ phiếu gần đó đã xảy ra cách đây hơn 2 năm. Như bạn có thể thấy không có đủ sự hỗ trợ để thực sự đóng câu hỏi này. Nếu bạn nghĩ rằng câu hỏi khác nên có câu trả lời tốt hơn, thì tôi khuyên bạn nên thêm một câu trả lời. – zzzzBov

+0

Dường như không có câu trả lời hay nào! Nó chỉ là một lỗ đen nhỏ trong đối tượng cửa sổ javascript tôi đoán! Tôi có cùng một mối quan tâm: mã của tôi sẽ mở tập tin trên bay có chứa các báo cáo nhưng tên tập tin không phải là những gì mã của tôi xác định. Tôi không nên yêu cầu người dùng nhấp vào a href và tải xuống tệp. –

Trả lời

23

Thay nút "Lưu" bằng liên kết cố định và đặt thuộc tính mới download động. Làm việc trong Chrome và Firefox:

var d = "ha"; 
$(this).attr("href", "data:image/png;base64,abcdefghijklmnop").attr("download", "file-" + d + ".png"); 

Dưới đây là một ví dụ làm việc với tên đặt là ngày hiện tại: http://jsfiddle.net/Qjvb3/

Dưới đây là một bảng tương thích cho download thuộc tính: http://caniuse.com/download

+1

tải xuống trình duyệt hỗ trợ thuộc tính http://caniuse.com/#feat=download – jcubic

+0

Như trên, không hỗ trợ thuộc tính tải xuống trong Safari & IE. – LT86

5

Sử dụng filename bất động sản như thế này:

uriContent = "data:application/octet-stream;filename=filename.txt," + 
       encodeURIComponent(codeMirror.getValue()); 
newWindow=window.open(uriContent, 'filename.txt'); 

EDIT:

Rõ ràng, không có cách nào đáng tin cậy để làm điều này. Xem: Is there any way to specify a suggested filename when using data: URI?

+0

Hmm, tôi đã thử nó và nó vẫn đang tải xuống một tệp có tên 'download'. Đây là mã của tôi ngay bây giờ: 'uriContent =" dữ liệu: application/octet-stream; filename = filename.txt, "+ encodeURIComponent (codeMirror.getValue()); newWindow = window.open (uriContent, 'filename.txt'); ' – skimberk1

+2

Dường như không hoạt động đối với một chút thử nghiệm trình duyệt mà tôi đã thực hiện trong Firefox; đây có phải là một tính năng trong một trình duyệt khác không? [Wikipedia đề cập rằng URL dữ liệu không thể mang tên tệp] (http://en.wikipedia.org/wiki/Data_URI_scheme#Disadvantages). – zzzzBov

+0

Hmm ok, cũng cảm ơn câu trả lời anyway! – skimberk1

13
function saveAs(uri, filename) { 
    var link = document.createElement('a'); 
    if (typeof link.download === 'string') { 
     document.body.appendChild(link); // Firefox requires the link to be in the body 
     link.download = filename; 
     link.href = uri; 
     link.click(); 
     document.body.removeChild(link); // remove the link when done 
    } else { 
     location.replace(uri); 
    } 
} 
+0

Bạn đã cứu cuộc đời tôi. Cảm ơn –

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