我可以设置Chrome中显示的PDF对象的文件名吗?

时间:2018-11-29 21:55:18

标签: javascript google-chrome pdf ecmascript-6 blob

在我的Vue应用程序中,我收到一个PDF斑点,并希望使用浏览器的PDF查看器显示它。

我将其转换为文件,并生成对象网址:

const blobFile = new File([blob], `my-file-name.pdf`, { type: 'application/pdf' })
this.invoiceUrl = window.URL.createObjectURL(blobFile)

然后,通过将该URL设置为对象元素的data属性来显示它。

<object
  :data="invoiceUrl"
  type="application/pdf"
  width="100%"
  style="height: 100vh;">
</object>

然后,浏览器使用PDF查看器显示PDF。但是,在Chrome中,未使用我提供的文件名(此处为my-file-name.pdf):我在PDF查看器的标题栏中看到一个哈希,并且在使用“右键单击”下载文件时->另存为...”或查看者的控件,它会使用blob的哈希(cda675a6-10af-42f3-aa68-8795aa8c377d或类似名称)保存文件。

查看器和文件名可以像我在Firefox中所希望的那样工作;这只是不使用文件名的Chrome。

是否可以使用本机Javascript(包括ES6,但Vue除外,但没有第三方依赖)来设置Chrome中Blob /对象元素的文件名?

[edit]如果有帮助,则响应具有以下相关的标题:

Content-Type: application/pdf; charset=utf-8
Transfer-Encoding: chunked
Content-Disposition: attachment; filename*=utf-8''Invoice%2016246.pdf;
Content-Description: File Transfer
Content-Encoding: gzip

3 个答案:

答案 0 :(得分:3)

Chrome的扩展名似乎依赖于URI中设置的资源名称,即file.ext中的 protocol://domain/path/file.ext

因此,如果您的原始URI包含该文件名,那么最简单的方法可能就是将您的data设置为直接从中获取pdf的URI,而不是采用Blob的方式。

现在,在某些情况下无法完成操作,因此,存在一种令人费解的方法,该方法可能无法在以后的Chrome版本中使用,并且可能无法在其他浏览器中使用,来设置Service Worker

正如我们首先说的,Chrome浏览器会解析URI以查找文件名,因此我们要做的就是拥有一个带有该文件名的URI,指向我们的BlobURI。

要做到这一点,我目前发现的唯一方法是

  1. 从文档中发出POST请求,该请求会将Blob发送到我们的ServiceWorker。
  2. 在ServiceWorker中,缓存已发送的Blob
  3. 还是从ServiceWorker那里返回一个新的伪URI,我们将使用它在 2中缓存的Blob进行映射。
  4. 从文档中,将