【问题标题】:Javascript to Download StringJavascript 下载字符串
【发布时间】:2014-02-19 22:01:48
【问题描述】:

尝试使用 Javascript 启动浏览器下载,但我要下载的数据是字符串,而不是文件。我知道如果它是一个文件,下面会这样做:

window.location.href = '/filepath/file.csv';

我怎样才能得到同样的效果,只有一个字符串(带有csv数据),而不是服务器上已经存在的文件?

【问题讨论】:

标签: javascript


【解决方案1】:

使用我方便的下载器:

<script src="http://danml.com/js/download.js"></script>
<script>download("hello world", "hello.txt", "text/plain")</script>

你也可以在没有库的情况下做到这一点,虽然我的“lib”不是很大并且支持旧的 FF+CH 和 IE10:

<a id=dl download="file.txt">Download</a>
<script>
content=prompt("enter contents");
dl.href="data:text/plain,"+encodeURIComponent(content);
dl.click();
</script>

编辑:链接脚本现在支持 window.URL.createObjectURL() 用于使用 dataURL 下载太大的文件。我不知道新的限制,但 10mb 仅适用于文件,而 ~2mb 是许多 dataURL (基于 window.open/A[download] )解决方案的限制3

【讨论】:

  • 太棒了!!我不仅喜欢你的实现依赖于超时,而且很高兴知道它是可能的。
  • 超时是为了让 DOM 修改在脚本线程尝试命中它之前“下沉”。除非您调整脚本以回收临时锚标记,否则需要可靠性...
  • 是的,我明白了。这可能是不合理的——当我看到一个依赖超时而不是事件的代码时——我下意识地开始认为它有问题。
  • 好吧,如果 dom 修改事件将它们的 $#1t 放在一起,我会使用那些...
  • 漂亮!感谢您的帮助。
【解决方案2】:

以下是我过去编写的用于处理此类行为的函数(可能需要一些调整):

var downloadFile = function (filename, dataValue) {
    window.URL = window.webkitURL || window.URL;
    window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder;

    var prevLink = output.querySelector('a');
    if (prevLink) {
        window.URL.revokeObjectURL(prevLink.href);
        output.innerHTML = '';
    }

    var a = document.createElement('a');
    a.download = '" + filename + @".csv';

    if (BlobBuilder == undefined) {
        var bb = new Blob([dataValue], { 'type': MIME_TYPE });
        a.href = window.URL.createObjectURL(bb);
    }
    else {
        var bb = new BlobBuilder();
        bb.append(dataValue);
        a.href = window.URL.createObjectURL(bb.getBlob(MIME_TYPE));
    }

    a.textContent = 'Download ready';

    a.dataset.downloadurl = [MIME_TYPE, a.download, a.href].join(':');
    a.draggable = true; // Don't really need, but good practice.
    a.classList.add('dragout');

    output.appendChild(a);

    a.onclick = function (e) {
        if ('disabled' in this.dataset) {
            return false;
        }
    };
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2014-01-12
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多