javascript在Safari中下载csv数据

时间:2015-09-08 20:26:38

标签: javascript csv download safari

无论如何要下载我在Safari中的javascript中创建的csv字符串吗?

编辑:我不想(不能)在服务器上创建文件。

我有以下代码,它可以在其他浏览器上正常工作,但不适用于Safari。我能做的最好的事情是在新窗口中打开数据,但这对用户来说是一种糟糕的UI体验。

    $("#csv").click(function(event) {
        event.preventDefault();
        navigator.sayswho = (function() {
            var ua = navigator.userAgent, tem,
            M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
            return M[1];
        })();

        var download = function (content, fileName, mimeType) {
            var a = document.createElement('a');
            mimeType = mimeType || 'application/octet-stream';
            mimeType = 'application/octet-stream';

            if (navigator.msSaveBlob) { // IE10
                return navigator.msSaveBlob(new Blob([content], {
                    type: mimeType
                }), fileName);
            } else if ('download' in a) { //html5 A[download]
                a.href = 'data:' + mimeType + ',' + encodeURIComponent(content);
                a.setAttribute('download', fileName);
                document.body.appendChild(a);
                setTimeout(function () {
                    a.click();
                    document.body.removeChild(a);
                }, 66);
                return true;
            } else { //do iframe dataURL download (old ch+FF):
                if (navigator.sayswho == 'Safari') {
                    var uri = 'data:text/csv;charset=utf-8,' + escape(content);
                    var link = document.createElement("a");
                    link.href = uri;
                    link.target = "_blank";
                    link.style = "visibility: hidden";
                    link.download = fileName;
                    document.body.appendChild(link);
                    link.click();
                    document.body.removeChild(link);
                }
                else 
                {
                    var f = document.createElement('iframe');
                    document.body.appendChild(f);
                    f.src = 'data:' + mimeType + ',' + encodeURIComponent(content);

                    setTimeout(function () {
                        document.body.removeChild(f);
                        }, 33333);
                        return true;
                }
            }
        }

        //csv_content is my string that has the csv data in it.
        download(csv_content, moment().format("YYYY_MM_DD_HH_mm") + '.csv', 'text/csv');
    });

在Chrome和FireFox中,它按预期工作。我使用FileSaver.js(https://stackoverflow.com/a/14858315/1758023)看到了一些答案,但评论说这不起作用(我也不能使它工作)。

2 个答案:

答案 0 :(得分:1)

尝试使用以下js函数。

function download()
{
    window.location = '<<your file name with full path>>';
    //for ex. function download()
    //window.location = 'mobilepayreport.xls';
}

答案 1 :(得分:0)

我也遇到过safari中的问题。您可以在safari中创建和下载csv文件。但是直到您的文件没有物理存储在任何位置,它不显示文件名并在下载弹出窗口中输入(它总是显示未知因此,我建议使用ajax将数据作为html传递到服务器端代码并​​创建一个文件,并且通过该调用的响应创建从服务器端代码存储的文件的链接。下载文件,然后您可以删除此文件