如何在浏览器中下载PDF文件

问题描述

在开发过程中,遇到了需要下载文件的需求,一般是直接使用 window.open() 方法,或者通过 a 标签点击下载。但是 PDF 文件只是打开了浏览器携带的 PDF 预览,需要用户手动点击预览页面的下载按钮才能下载文件。那么如何实现直接下载呢。

解决方案

将 PDF 文件的 MIME type 改成 application/octet-stream 并加入 Content-Disposition: attachment header。(原本的 PDF 文件 MIME type 为 application/pdf,浏览器识别到这个类型会自动打开)

可以通过后端接口返回时修改,也可以通过前端自行修改,前端修改如下:

  fetch(url, {method: 'get'})
    .then(function (res) {
      if (res.status !== 200) {
        return res.json();
      }
      return res.arrayBuffer();
    })
    .then((blobRes) => {
      // 生成 Blob 对象,设置 type 等信息
      const e = new Blob([blobRes as BlobPart], {
        type: 'application/octet-stream',
      });
      // 将 Blob 对象转为 url
      const link = window.URL.createObjectURL(e);
      const a = document.createElement('a');
      a.href = link;
      a.download = fileName;
      a.click();
    })
    .catch((err) => {
      //! error handle
    });