如何使用 window.open 设置文件名

IT技术 javascript download window.open
2021-02-16 06:59:47

我正在尝试下载由 JavaScript 计算的临时结果。假设我有一个 string str,我想下载一个包含的文件str并将其命名为data.csv,我正在使用以下代码:

window.open('data:text/csv;charset=utf-8,' + str);

文件可以成功下载,但是如何data.csv自动命名文件而不是每次手动设置名称?

4个回答

您可以使用元素download属性来实现这一点<a>例如:

<a href="1251354216241621.txt" download="your-foo.txt">Download Your Foo</a>

此属性指示应下载文件(而不是显示,如果适用)并指定应为下载的文件使用哪个文件名。

window.open()您可以使用download属性和.click()生成一个不可见的链接,而不是使用它。

var str = "Name, Price\nApple, 2\nOrange, 3";
var uri = 'data:text/csv;charset=utf-8,' + str;

var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = "data.csv";

document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);

不幸的是,并非所有浏览器都支持此功能,但添加它不会使其他浏览器的情况更糟:它们将继续下载带有无用文件名的文件。(这假设您使用的 MIME 类型是他们的浏览器尝试下载。如果您试图让用户下载.html文件而不是显示它,这在不受支持的浏览器中不会有任何好处。)

downloadLink.click();Google Chrome 58.0.3029.110 中部分没有开始下载。我必须手动单击超链接才能这样做。任何变通方法或在指定的浏览器中不受支持。
2021-04-16 06:59:47
@AchmedzianovDanilian 我必须附加链接才能使其在 Firefox 59 中工作。如果在 DOM 中没有它,click() 似乎什么也不做。
2021-04-21 06:59:47
downloadLink.click() 在带有 ics 文件的 Safari 上对我不起作用。Safari 不会自动打开文件。使用 window.open 并且它可以工作,但文件名未知。
2021-04-27 06:59:47
您不必将此元素附加到正文。只需调用.click()仅此而已
2021-05-02 06:59:47
@ManoDestra,你说得对。刚查了一下,这个。
2021-05-06 06:59:47

这在最新的 Chrome 中不起作用,我已经修改了它,下面的代码可以正常工作,

 $("#download_1").on('click', function() {
    var json_pre = '[{"Id":1,"UserName":"Sam Smith"},{"Id":2,"UserName":"Fred Frankly"},{"Id":1,"UserName":"Zachary Zupers"}]';
    var json = $.parseJSON(json_pre);
   
    var csv = JSON2CSV(json);
    var downloadLink = document.createElement("a");
    var blob = new Blob(["\ufeff", csv]);
    var url = URL.createObjectURL(blob);
    downloadLink.href = url;
    downloadLink.download = "data.csv";

    document.body.appendChild(downloadLink);
    downloadLink.click();
    document.body.removeChild(downloadLink);
});

因此,当您单击 download_1 id 按钮时,它将创建一个不可见的下载链接并单击该链接。我用另一个函数来编写js。

JSON2CSV 函数如下:

function JSON2CSV(objArray) {
    var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
    var str = '';
    var line = '';

    for (var i = 0; i < array.length; i++) {
        var line = '';

        for (var index in array[i]) {
           line += array[i][index] + ',';
        }

        line = line.slice(0, -1);
        str += line + '\r\n';
    }
    return str;
}

希望它会帮助其他人:)

完美下载CSV文件!您能否帮助说明如何包含密钥(ID、用户名)?
2021-04-26 06:59:47
哪一部分?它在 chrome 中对我有用,可以下载具有正确名称的文件
2021-05-14 06:59:47

接受的较短版本(就我而言,必须使用 unicode)

var link = document.createElement("a");
link.href = 'data:text/csv,' + encodeURIComponent("algún texto");
link.download = "Example.csv";
link.click();
对我来说它已经打开了。试着让我知道。
2021-04-20 06:59:47
不下载就可以直接打开吗??
2021-04-30 06:59:47
我认为这是浏览器设置。您可以将其设置为打开或下载。
2021-05-01 06:59:47
不适合我。它开始下载。MacOS 中的 Safari、Chrome。
2021-05-13 06:59:47

IE 的一个解决方案是使用 msSaveBlob 并传递文件名。

对于现代浏览器,解决方案是这样的,经过测试:IE11、FF 和 Chrome

 var csvData = new Blob([arg.data], {type: 'text/csv;charset=utf-8;'});
        //IE11 & Edge
        if (navigator.msSaveBlob) {
            navigator.msSaveBlob(csvData, exportFilename);
        } else {
            //In FF link must be added to DOM to be clicked
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(csvData);
            link.setAttribute('download', exportFilename);
            document.body.appendChild(link);    
            link.click();
            document.body.removeChild(link);    
        }

有一个关于一个好discution这里