14

我想知道是否可以强制浏览器(至少 Chrome)下载data:text/plainURL。

Chrome 会下载二进制 URL(例如data:application/zip;base64,...),但不会下载可以在浏览器中查看的文件(例如文本文件)。

到目前为止,我已经尝试过没有运气的是:

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

但似乎我无法添加这样的标题。

有什么方法可以让 Chrome 下载一个data:text/plain,...URL?

4

5 回答 5

17

到目前为止,它已经可以<a download>在 Chrome 中使用。使用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前缀,但两者都可以避免。

于 2012-07-27T10:36:07.663 回答
13

试试这个:

<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)。

于 2013-11-29T09:25:16.580 回答
9

这是用于创建文本 blob 并下载为文本文件的纯 Javascript 解决方案

var fileContent = 'This is sample text file';
var fileName = 'sampleFile.txt';

const blob = new Blob([fileContent], { type: 'text/plain' });
const a = document.createElement('a');
a.setAttribute('download', fileName);
a.setAttribute('href', window.URL.createObjectURL(blob));
a.click();
于 2019-06-19T09:33:38.710 回答
1

我所做的是将数据发送到服务器,服务器使用以下 HTTP 标头将它们发送回:

Content-disposition: attachment;filename=test.txt

我不喜欢这个,但它工作得很好。

于 2011-06-25T14:01:57.093 回答
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>
于 2017-02-21T13:53:45.820 回答