URL.createObjectURL(blob):如何为动态生成的.pdf提供“有意义的文件名”?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (708)

我调用Web服务来生成.pdf,然后使用createObjectURL和iframe来打印并显示它:

    var title = "Claim-" + this.claimNumber + "-" + new Date() + ".pdf";
    var blob = new Blob([wsRequest.response], { type: 'application/pdf' });
    blob.name = title;
    if (browser() === 'IE') {
        window.navigator.msSaveOrOpenBlob(blob, title);
    } else {
        var fileURL = URL.createObjectURL(blob);
        var win = window.open();
        win.document.write('<iframe name="' + title + '" src="' + fileURL + '" frameborder="0" style="border:0; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%;" allowfullscreen></iframe>');
        win.document.title = title;

对于IE浏览器来说,它的效果很好:.pdf在Acrobat Reader中显示,它显示,我可以打印它......并且它有一个“有意义的文件名”。

对于Chrome浏览器/嵌入式.pdf查看器,它也可以正常工作:它出现在它自己的选项卡中,并且该选项卡具有“有意义的文件名”。

但是,如果Chrome在Acrobat阅读器中显示图像,则:

a)我得到一个新的空白标签(带有“有意义的名字”)

b)Acrobat显示GUID - 由createObjectURL()分配的GUID:

问:如果Chrome在外部查看器(如Acrobat)中打开它,是否有任何方法可以将“有意义的名称”分配给动态生成的.pdf?

提问于
用户回答回答于

一种方法是在打开文件之前用文件名保存文件。不幸的是,这可能不会自动打开文件。

var fileLink = document.createElement('a');
fileLink.href = fileURL;
fileLink.download = title;
fileLink.click();

另一种方法是在你的Web服务器上生成PDF和文件名,并远程提供链接,而不是在浏览器中本地生成文件名。这可能为你提供更一致的时间戳,因为它们是由你的服务器生成的,而不是在不同时区中的所有客户端生成的。然后,如果你有任何疑问,你和你的客户将能够在逻辑上引用相同的文档。

扫码关注云+社区

领取腾讯云代金券