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

2024-03-27

我的网站上有一个 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。

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

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

火狐浏览器更新:我得到了 Firefox 的解决方案,但它在 Chrome 中不起作用。代替

this._blobUrl = URL.createObjectURL(blob);

I do

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)。所以这意味着我们不能使用only这; Firefox 将始终被标记为未在浏览器中打开,尽管它很可能是这样。

所以我认为唯一的方法仍然是一个很长的方法......这里详细暴露。 https://stackoverflow.com/a/53593453/3702797.

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文件下载 - 如何控制文件名并尊重用户的偏好? 的相关文章

随机推荐