javascript - 文件下载 - 如何控制文件名并尊重用户偏好?

标签 javascript html google-chrome firefox

我的站点上有一个 blob url 和一个按钮。用户可以单击该按钮,然后 blob 在新选项卡中打开。

<a class="downloadlink" id="downloadlink" target="_blank" href="[[_blobUrl]]"></a>

这有效。

如果用户设置了此 blob 后面的文件类型(例如 pdf)以保存文件而不是在浏览器中预览,则当然会下载文件。但是 firefox 会创建一个随机格式的文件名

[a-zA-Z0-9]{8}\.pdf

Chrome 使用 blob uuid 并附加 pdf。

如何控制文件名并尊重用户偏好?

当我添加下载 属性时,文件始终会被下载,当用户对指定文件类型设置“预览”时也是如此。我想要用户喜欢的行为(预览或下载),但仍控制文件名以防用户喜欢下载文件。

Firefox 更新: 我有一个适用于 firefox 的解决方案,但它不适用于 chrome。而不是

this._blobUrl = URL.createObjectURL(blob);

我愿意

let file = new File([blob], this.downloadname, {type: 'application/pdf'});
this._blobUrl = URL.createObjectURL(file);

最佳答案

Chrome 确实通过 navigator.plugins 字典公开了此首选项。如果此对象包含 PDF 阅读器,那么您就知道用户希望看到它显示在他们的浏览器中。

const opensInBrowser = [...navigator.plugins].some(plug => [...plug].some(mime => mime.type === 'application/pdf'))
console.log(opensInBrowser);

但这只适用于 Chrome。 Firefox 不会在此处公开此信息(IIRC 他们在技术上不使用插件来显示 pdf)。所以这意味着我们不能使用这个; Firefox 将始终标记为未在浏览器中打开,虽然它很可能是。

所以我认为唯一的方法还是很长... exposed in details here. .

使用 Service Worker,我们可以伪造一个对命名文件的请求,Chrome 将使用该请求来设置名称,包括下载的文件和插件读取的 pdf。

直到他们跟随 Firefox 通过指向它们的 Blob URI 正确转发 File 对象名称。

关于javascript - 文件下载 - 如何控制文件名并尊重用户偏好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55828475/

相关文章:

JavaScript 弹出 Chrome 'save as' - 已停用?为什么?

javascript - Google Analytics 脚本未在 IE 中触发。页面上没有其他元素可以破坏脚本

javascript - 收集适当的 onScroll 数据来触发 AJAX 功能

javascript - Parent 中的 AddEventListener 和 iframe 中的 postMessage 不能一起工作

HTML 标签用于突出显示 MYSQL 和 Crystal Reports 中的数据

javascript - 在 Rails 中,onbeforeunload 无法在 Chrome 浏览器中始终如一地工作

javascript - 如何将点击项目的索引移动到另一个不是父组件的组件?

html - Ajax 从不同的文件加载数据

javascript - 清空 $_POST。值最终以 $GLOBAL 结尾

google-chrome - 谷歌浏览器从 URL Bar 搜索我的网站