javascript - 使用 javascript 生成要下载的文件。如何使用没有 HTTP 标头的“另存为”对话框?
问题描述
我正在使用此功能下载文件:
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:https ://jsfiddle.net/kbwrcL14/
我之前已经看到过有关像设置 a 那样操作标头的建议Content-Disposition
- 但是,当您即时生成文件时,这可能吗?Afaik headers 是在 HTTP body 之前发送的,但是当 JS 代码运行时,整个 HTTP 请求已经完成,文件是由客户端自己生成的。
有没有办法在不使用 http 标头的情况下完成这项工作?
解决方案
推荐阅读
- c++ - C++中如何判断一个值是否存在于map中
- c# - 窗体 Visual C# 中的控制台
- javascript - 如何使用两个数组聚合有条件的数据?
- android - 运行 Android 8.0 的三星设备上的共享元素转换崩溃
- c# - 实体框架未在 1:0..1 关系中插入相关记录(意外结果)
- rubocop - 子目录 .rubocop.yml 继承自父目录 .rubocop.yml
- c++ - 递归时为参数赋值
- python-3.x - hasattr 说谎?(AttributeError:“方法”对象没有属性“__annotations__”)
- sql - Azure WebJob to:从 SQL 创建 CSV 文件并通过电子邮件作为附件发送
- html - 是否可以以编程方式选择一个项目
- 列表?