2011-06-24 27 views
8

我想知道是否可以強制瀏覽器(至少Chrome)下載data:text/plain URL。強制下載'data:text/plain'URL

Chrome確實下載了二進制URL(例如data:application/zip;base64,...),但它並未下載可在瀏覽器內部查看的文件(如文本文件)。

我已經沒有運氣試圖到目前爲止是這樣的:

data:text/plain;content-disposition=attachment;filename=test.txt;... 

但好像我不能添加這樣的標題。

有什麼辦法讓Chrome下載data:text/plain,...的URL?

回答

12

截至目前,Chrome已經可以使用<a download>了。使用dispatchEvent,您可以隨時下載任何字符串作爲文件(即使使用自定義文件名)。這裏有一個使用它的效用函數:

var downloadFile = function(filename, content) { 
    var blob = new Blob([content]); 
    var evt = document.createEvent("HTMLEvents"); 
    evt.initEvent("click"); 
    $("<a>", { 
    download: filename, 
    href: webkitURL.createObjectURL(blob) 
    }).get(0).dispatchEvent(evt); 
}; 

用法:

downloadFile("foo.txt", "bar"); 

它使用jQuery和的webkit前綴,但兩者是可以避免的。

1

我所做的就是將數據發送到服務器,該服務器發送回用下面的HTTP標頭:

Content-disposition: attachment;filename=test.txt 

我不喜歡這一點,但它的工作原理相當好。

6
Try this: 
<a download="file_downloaded_via_data_URL.txt" 
href="data:text/plain;base64,SGVsbG8sIHdvcmxkISBJJ20gZG93bmxvYWRlZCB2aWEgImRhdGE6dGV4dC9wbGFpbjsuLi4iIFVSTCB1c2luZyA8YSBkb3dubG9hZD0iZmlsZV9uYW1lIi4uLj4uDQpNeSBiaXJ0aHBsYWNlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzY0Njg1MTcvDQoNCk1vcmUgYWJvdXQ6DQpodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sL2xpbmtzLmh0bWwjYXR0ci1oeXBlcmxpbmstZG93bmxvYWQNCmh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWwvbGlua3MuaHRtbCNkb3dubG9hZGluZy1yZXNvdXJjZXMNCg0KQnJvd3NlciBzdXBwb3J0OiBodHRwOi8vY2FuaXVzZS5jb20vZG93bmxvYWQ="> 
    Download text file 
</a> 

它使用HTML5屬性download="filename.ext"。 (沒有JS需要:)

更多: http://www.w3.org/TR/html/links.html#downloading-resources

支持的瀏覽器可以在http://caniuse.com/download

檢查(至於現在,2013年,沒有IE也不支持Safari瀏覽器)

我認爲,您可以對不支持的瀏覽器進行回退:使用JS將href="..."的值更改爲您的服務器腳本的URL(它將使用適當的HTTP標頭Content-disposition: attachment;filename=filename.txt返回文件內容)。

+0

這太棒了,一些新的瀏覽器現在不支持在2017年導航到數據網址 – code4j

0

這工作得要命......

<div class="tags-style-one dragme" draggable="true" data-transfer="33343">some value is 33343</div> 

    <script type="text/javascript"> 
    (function ($) { 
     $(document).ready(function() { 
     $('.dragme').on("dragstart",function(evt) { 
      evt.originalEvent 
        .dataTransfer 
        .setData(
          "text/plain", 
          $(this).data('transfer').toString() 
        ); 
     }); 
    })(jQuery); 
</script>