在Internet Explorer中下载动态CSV

Ser*_*o B 13 javascript jquery internet-explorer

以下代码适用于FireFox和Chrome,但不适用于IE.基本上,我有一个JSON对象转换为数组,然后转换为csv格式,当我单击FF或Chrome中的按钮时,文件被下载或" 另存为"窗口打开,但在IE中打开一个新选项卡.在一个完美的世界中IE不会存在,但在现实世界中我们必须让它工作,哈哈.

$("#csvbtn").click(function(e){
    e.preventDefault();
    var  json_obj= JSON.parse(result);
    var csv = JSON2CSV(json_obj);
    window.open("data:text/csv;charset=utf-8," + escape(csv));
});
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我在Windows 8中使用IE 11来测试这个,如果这有所不同.

谢谢大家!

Ser*_*o B 41

这是我的解决方案,以防其他人正在寻找解决方案.现在它适用于FF,Chrome和IE

var csv = JSON2CSV(json_obj);            
var blob = new Blob([csv],{type: "text/csv;charset=utf-8;"});

if (navigator.msSaveBlob) { // IE 10+
navigator.msSaveBlob(blob, "csvname.csv")
    } else {
        var link = document.createElement("a");
        if (link.download !== undefined) { // feature detection
            // Browsers that support HTML5 download attribute
            var url = URL.createObjectURL(blob);
            link.setAttribute("href", url);
            link.setAttribute("download", "csvname.csv");
            link.style = "visibility:hidden";
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }           
    }
Run Code Online (Sandbox Code Playgroud)

现在我只需要弄清楚是否有一种方法可以弹出另存为屏幕,而不是自动保存文件.如果有人知道答案,请分享.现在我的用户将不得不使用此功能.

非常感谢所有伟大的答案,你们真棒.


Sam*_*son 18

出于安全考虑,Internet Explorer不允许将数据URI用作可导航内容.为了理解原因,我建议您阅读Henning Klevjer关于主题的数据URI网络钓鱼的简短白皮书.总而言之,这已被证明可以开辟最终用户被欺骗放弃敏感信息的途径.

另外,从MSDN上数据协议文档:

出于安全原因,数据URI仅限于下载的资源.数据URI不能用于导航,脚本编写或填充框架或iframe元素.

说实话,传递数据URI window.open感觉有点hacky.相反,您应该使用API​​来处理该过程(如果存在的话).如果您想在Internet Explorer中将文件下载到用户的计算机,请考虑使用navigator.msSaveBlobnavigator.msSaveOrOpenBlob.

例如,请考虑以下事项:

if ( window.navigator.msSaveOrOpenBlob && window.Blob ) {
    var blob = new Blob( [ "A,B\nC,D" ], { type: "text/csv" } );
    navigator.msSaveOrOpenBlob( blob, "strings.csv" );
}
Run Code Online (Sandbox Code Playgroud)