在JavaScript中下载PDF Blob时出现问题

Bar*_*yle 2 javascript base64 blob file download

我创建了一个函数,该函数具有blobfileName,应该下载实现如下的blob:

const blobToBase64 = (blob, callback) => {
  const reader = new FileReader();
  reader.onloadend = () => {
    const base64 = reader.result;
    console.log({ base64 });
    callback(base64);
  };
  reader.readAsDataURL(blob);
};

const downloadFile = (blob, fileName) => () => {
  const link = document.createElement('a');
  blobToBase64(blob, (base64) => {
    link.href = base64;
    link.download = fileName;
    link.click();
  });
};


downloadFile(myBlob, myFileName);
Run Code Online (Sandbox Code Playgroud)

为了尝试调试,我已经console.log注销了由base64创建的值reader.result

base64值是data:application/octet-stream;base64,Mzc4MDY4...

我的PDF文件已下载,但已损坏。我的文件下载实现中我做错了什么?

让我知道是否还有其他细节可能对此有所帮助?我100%确信Blob本身不是损坏的文件。

Kai*_*ido 10

我无法确定为什么您的代码无法正常工作,但是我可以确定您所做的事情充其量是没有用的。

不要将Blob转换为dataURI的时间有99%*,您可以使用原始Blob和blobURI直接完成此dataURI的操作。

*剩下的1%是您需要创建包含二进制数据的独立文档时发生的,但这种情况并不常见。

在这里,您可以再次直接通过Blob完成您想要做的事情(设置锚点以指向Blob的数据):只需调用,即可创建blobURI(这只是指向内存中数据的指针)URL.createObjectURL(blob)

const downloadFile = (blob, fileName) => {
  const link = document.createElement('a');
  // create a blobURI pointing to our Blob
  link.href = URL.createObjectURL(blob);
  link.download = fileName;
  // some browser needs the anchor to be in the doc
  document.body.append(link);
  link.click();
  link.remove();
  // in case the Blob uses a lot of memory
  window.addEventListener('focus', e=>URL.revokeObjectURL(link.href), {once:true});
};


downloadFile(new Blob(['random data']), "myfile.txt");
Run Code Online (Sandbox Code Playgroud)

  • @SajinMAboobakkar 也许是因为这个答案显示了做到这一点的最佳解决方案? (7认同)
  • 我不知道为什么人们赞成这个答案。他的问题是在 javascript 中下载 PDF blob 时出现问题。 (2认同)

Aka*_*ati 8

我尝试使用 Fetch API 从提供octet-stream内容作为响应的服务器下载 PDF 文件。所以,如果你检查响应,你会得到这样的字符%PDF-1.4

这是解决方案:

function download(pdfUrl) {
        fetch(pdfUrl).then(resp => resp.arrayBuffer()).then(resp => {

            // set the blog type to final pdf
            const file = new Blob([resp], {type: 'application/pdf'});

            // process to auto download it
            const fileURL = URL.createObjectURL(file);
            const link = document.createElement('a');
            link.href = fileURL;
            link.download = "FileName" + new Date() + ".pdf";
            link.click();
        });
    }
Run Code Online (Sandbox Code Playgroud)

您可以使用相同的方法并在创建 blob 之前解码八位字节流的内容。