【问题标题】:How to serve blob and have good filename for all users?如何为所有用户提供 blob 并具有良好的文件名?
【发布时间】:2018-04-24 22:06:54
【问题描述】:

我有一个 PDF 文件作为 blob 对象。我想为我的用户服务,现在我正在做:

html = '<iframe src="' + URL.createURL(blob) + '">'; 

这对于想要使用浏览器内 PDF 工具的人来说效果很好。

但是...有些人的浏览器设置为自动下载 PDF。对于这些人来说,下载文件的名称是一些基于 blob URL 的随机字符串。这对他们来说是一种糟糕的体验。

我知道我也可以:

<a href="blobURL" download="some-filename.pdf">

但这对于想要使用浏览器内 PDF 阅读器的人来说是一种糟糕的体验,因为这会迫使他们下载文件。

有没有办法让每个人都有好的文件名并允许每个人以他们想要的方式阅读 PDF(在他们的浏览器或操作系统的阅读器中)?

谢谢

【问题讨论】:

标签: javascript pdf blob


【解决方案1】:

我查看了 createObjectURL(blob) 的文档,它总是会返回一个唯一且特定格式的 url。此处无法更改网址。

插件的东西在浏览器之间并不一致。

现在这是我的激进想法

  1. 查找或创建(如果不可用)一个 js 库,该库可以创建 PDF 文件并将其从 blob 保存到服务器。 (我浏览了其中一些,例如“jsPDF”、“pdfkit”,但没有一个使用 blob)

  2. 使用有效名称将文件保存到服务器

  3. 在 iframe 中使用上述名称。

【讨论】:

  • 相当疯狂的想法。我们还没有完全绝望地尝试它,但我认为你是对的——它会起作用的。
【解决方案2】:

尝试将 &filename=thename.pdf 附加到二进制、元数据或 http 标头:

Content-Disposition:附件;文件名="thename.pdf"

【讨论】:

  • createObjectURL(blob) 将始终返回 BLOB: UUID 形式的 url
  • 我们对此无能为力。我有兴趣看到一个有效的例子,但它对我们不起作用。
【解决方案3】:

至少看看谷歌浏览器,如果用户禁用 PDF 查看器(使用“下载 PDF 文件而不是在 Chrome 中自动打开”选项),那么window.navigator.plugins 将既不显示“Chromium PDF 插件”也不显示“Chromium PDF观众”。如果该选项保留为默认设置,则查看器将显示在插件列表中。

使用此方法,可以利用window.navigator.plugins 来检查任何元素的names 是否是上述插件中的任何一个。然后,根据该结果,显示&lt;iframe&gt;&lt;a href="blobUrl" download="file.pdf"&gt;。对于其他浏览器,我想必须使用不同的方法。您还可以检查“Acrobat Reader”插件,某些机器可能有这个插件,甚至只是“PDF”这个词。

附带说明一下,使用 http://www.pinlady.net/PluginDetect/PDFjs/ 似乎可以检测到是否启用了默认的 Firefox PDF 查看器。

【讨论】:

  • 看起来window.navigator.plugins 也适用于 Opera。
  • 我们查看了那个 FF 插件检测器,它只是 hacky。恐怕这是唯一的方法,但我仍然希望有更好的方法。
猜你喜欢
  • 2011-10-03
  • 2021-05-26
  • 2018-11-07
  • 1970-01-01
  • 2013-10-05
  • 2012-06-13
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多