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

pau*_*sm4 8 javascript iframe html5

我正在调用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;
Run Code Online (Sandbox Code Playgroud)

对于IE来说,它的工作原理非常好:.pdf出现在Acrobat Reader中,它可以显示,我可以打印...并且它的文件名“有意义”。

对于Chrome /嵌入式.pdf查看器,它也可以正常运行:它显示在自己的标签中,并且该标签具有“有意义的文件名”。

但是,如果Chrome在Acrobat Reader中显示图像,请执行以下操作:

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

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

示例:“ blob:http//192.168.116.170:9080 / dd554e89-0174-4b9a-bbd1-0934239a4c9

如您所见,它们都没有blob.name = title<iframe name=" + title + "...>似乎没有帮助。

问:如果Chrome在外部查看器(如Acrobat)中打开动态生成的.pdf,有什么办法可以给动态生成的.pdf指定“有意义的名称”?

小智 7

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

var fileLink = document.createElement('a');
fileLink.href = fileURL;
fileLink.download = title;
fileLink.click();
Run Code Online (Sandbox Code Playgroud)

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

  • 嗨 - 1) 将文件保存到服务器:好主意,但不是一个选项。2)“另存为”而不是“打开”:这实际上是我的解决方法。我为“保存到文件,而不是打印”添加了一个配置选项。但这真的,真的很糟糕:(我不想因为愚蠢的“文件名”而牺牲所有“立即显示”功能。有 *GOT* 是更好的方法。符合标准的等效于 IE `msSaveOrOpenBlob` :( (3认同)