我遇到的情况是我想让用户下载PDF。生成此PDF可能需要几秒钟,我不希望Web服务器线程等待生成PDF,因为这意味着该线程无法处理其他传入请求。
所以,我想要做的是介绍以下网址模式:
/request_download
调用后台作业生成PDF; /document.pdf
将在生成PDF后为其提供服务用例如下。
用户点击“下载PDF”。这将调用一段Javascript,它将显示一个微调器,向/request_download
发出请求并接收HTTP 202 Accepted,表示请求已被接受并且后台作业已创建。然后,JS应该定期轮询/request_download
url,直到它获得HTTP 201 Created,表明已经创建了PDF。包含Location
标头,供JS用于将客户端转发到/document.pdf
。 必须在新窗口中(或标签,至少它不应该替换当前页面)。我们用户的专业水平非常低,所以当我转到网址时,他们可能不知道如何回到网站。
问题
现在,window.open
可以正常工作,如果用户通过点击事件调用它。但是,一旦看到201 Created响应,我想通过window.open
在回调函数中调用setInterval
。但是,浏览器不会喜欢它并将其解释为弹出窗口,导致它被IE8-10以及Chrome上的弹出窗口阻止程序捕获。这是有道理的。
我也无法打开一个新窗口并在那里调用Javascript。在这种情况下,用户会看到一个带有微调器的空白页面。如果该页面然后转发到/document.pdf
,IE将显示此黄色警告栏,告知它阻止下载文件。 Chrome和Firefox会毫无问题地执行此操作,但很大一部分用户使用的是IE。
我尝试了什么,但没有效果
<a>
标记添加到文档正文并尝试使用javascript <a>
标记添加到文档正文并在其上调用MouseEvent
我完全没有关于如何完成这项工作的想法,并决定向互联网寻求帮助。我希望你们可以帮助我,或者认识到这个问题。提前谢谢!