使用javascript生成要下载的文件。如何使用';另存为';没有HTTP头的对话?

使用javascript生成要下载的文件。如何使用';另存为';没有HTTP头的对话?,javascript,Javascript,我正在使用此功能下载一个文件: function download(fileName, data) { fileName = fileName.replace(/\s+/gi, '_').replace(/[^a-zA-Z0-9-.,_]/gi, ''); let blob = new Blob([data], {type: 'text/plain'}); if(window.navigator.msSaveOrOpenBlob){ window.navi

我正在使用此功能下载一个文件:

function download(fileName, data) {
    fileName = fileName.replace(/\s+/gi, '_').replace(/[^a-zA-Z0-9-.,_]/gi, '');
    let blob = new Blob([data], {type: 'text/plain'});
    if(window.navigator.msSaveOrOpenBlob){
        window.navigator.msSaveBlob(blob, fileName);
    }else{
        let elem = window.document.createElement('a');
        elem.href = window.URL.createObjectURL(blob);
        elem.download = fileName;
        document.body.appendChild(elem);
        elem.click();
        document.body.removeChild(elem);
    }
}

// Example usage
$('button').on('click', function(){
    download("test.txt", "test");
});
它工作得非常好。但是,它似乎将文件直接下载到下载文件夹中。 我如何让它打开一个“另存为”对话框,这样用户就可以选择自己喜欢的下载位置

JSFiddle:

我以前看到过一些关于操作头的建议,比如设置
Content Disposition
——但是,当您动态生成一个文件时,这是可能的吗?Afaik头是在HTTP主体之前发送的,但是当JS代码运行时,整个HTTP请求已经完成,并且文件由客户端本身生成


有没有一种方法可以在不使用http头的情况下执行此操作?

下载位置由浏览器决定。也就是说,如果我是对的,您无法控制是否显示“另存为”对话框,因为这是客户端配置选项。实际上,
内容处置
头不是在请求头中发送的,而是在响应头中发送的。这意味着要使用这种技巧,您必须修改服务器代码,而不是网页上运行的javascript。