如何使用Javascript将当前页面作为文件/附件下载?

如何使用Javascript将当前页面作为文件/附件下载?,javascript,download,attachment,Javascript,Download,Attachment,我知道这里提到的隐藏iFrame技巧(http://stackoverflow.com/questions/365777/starting-file-download-with-javascript)在其他答案中 我对一个类似的问题感兴趣: 如何使用Javascript将当前页面(即当前DOM或其子集)作为文件下载 我有一个网页,它从非确定性查询(例如随机样本)中获取结果,并显示给用户。我已经可以通过querystring参数使页面返回文件,而不是呈现页面。我可以添加一个“获取文件版本”按钮(我

我知道这里提到的隐藏iFrame技巧(http://stackoverflow.com/questions/365777/starting-file-download-with-javascript)在其他答案中

我对一个类似的问题感兴趣:

如何使用Javascript将当前页面(即当前DOM或其子集)作为文件下载

我有一个网页,它从非确定性查询(例如随机样本)中获取结果,并显示给用户。我已经可以通过querystring参数使页面返回文件,而不是呈现页面。我可以添加一个“获取文件版本”按钮(我们的标准方法),但结果将与显示的结果不同,因为它是不同的查询运行

有没有办法通过Javascript将当前页面作为文件下载,或者复制到剪贴板是我唯一的选择

编辑 Stefan Kendall和dj_segfault建议的一个选项是编写结果服务器端,以便以后检索。好主意,但不幸的是,在本例中,在服务器端编写文件是不可能的


innerHTML
作为post参数传递到另一个页面怎么样?

我认为您不能完全按照您想要的方式来做。出于安全原因,JavaScript无法创建并下载文件。它也不能在服务器上创建它以供下载

如果我是您,我会做的是,在服务器端,在创建网页输出时,在临时目录的名称中创建一个会话ID为的输出文件,并在网页上有一个带有指向该文件链接的按钮


您可能需要一个单独的进程来删除超过一天或类似时间的文件。

您不能缓存查询结果,并通过某个键存储它吗?这样,您可以永远引用相同的报告输出,或者直到文件垃圾收集器出现。这也意味着你可以创建静态的URL来报告输出,这很好。

取决于大小,如果需要支持古浏览器,但是你可以考虑使用数据:创建一个动态文件:URI和链接。我在好几个地方见过这样的人。要让brorwser下载而不是显示它,请使用您在URI中输入的内容类型,并使用新的html5下载属性。(对不起,我是用手机写的)

您可以尝试使用协议
数据:文本/附件

例如:

<html>
<head>
    <style>
    </style>
</head>
<body>
    <div id="hello">
        <span>world</span>
    </div>
<script>
(function(){
    document.location = 
        'data:text/attachment;,' + //here is the trick
        document.getElementById('hello').innerHTML;
            //document.documentElement.innerHTML; //To Download Entire Html Source
})();
</script>
</body>
</html>

世界
(功能(){
document.location=
'data:text/attachment;,'+//技巧如下
document.getElementById('hello').innerHTML;
//document.documentElement.innerHTML;//下载整个Html源代码
})();

在shesek评论后编辑要在上面Mic精彩的回答中添加以下几点:

  • 如果您有Unicode内容(或希望在源代码中保留缩进),则需要将字符串转换为Base64,并告诉数据URI将数据按如下方式处理:
  • (function(){
        document.location = 
            'data:text/attachment;base64,' + // Notice the new "base64" bit!
            utf8_to_b64(document.getElementById('hello').innerHTML);
                //utf8_to_b64(document.documentElement.innerHTML); //To Download Entire Html Source
    })();
    
    function utf8_to_b64( str ) {
      return window.btoa(unescape(encodeURIComponent( str )));
    }
    
    --在Chrome/FF中工作

  • 您可以将这些内容放到锚定标记中,允许您设置下载属性:
  • <a onclick="$(this).attr('href', 'data:text/plain;base64,' + utf8_to_b64($('html').clone().find('#generate').remove().end()[0].outerHTML));" download="index.html" id="generate">Generate static</a>
    
    
    
    这将下载当前页面的HTML作为index.HTML,并删除用于生成输出的链接。这假设上面的utf8_to_b64()函数是在其他地方定义的

    有关数据URI的一些有用链接:

    这正是我所担心的。不幸的是,编写服务器端文件是不可能的。不幸的是,编写服务器端文件是不可能的。不需要iframe,他只需
    document.location=
    it@shesek今天我学到了一些重要的东西。谢谢@xan可能有一个
    窗口。打开
    并播放标题,但您会得到一个新选项卡new tab(新选项卡)如果没有,这对这种情况很好。
    不允许将顶部框架导航到数据URL: