通过GET请求启动文件下载

时间:2014-02-06 05:49:18

标签: javascript rest extjs download

所以我有ExtJS应用程序,其中Combo中的某个打开导致文件下载(读取:导出为PDF)。现在我们使用window.open来执行此操作,其中我们点击了一个特定的URL,该URL本质上是RESTful,类似于。

window.open('https://example.com/myapp/api/module/someId/exportPDF.pdf?clientId=bizzare123&param1=someValue');

这会打开新标签,我会下载文件。现在这在理论上是一个GET请求(虽然它没有出现在Chrome DevTools的“网络”选项卡中),我想传递一些JSON数据作为请求体(数据很大,所以我不能将它放在请求参数中)。 / p>

可以通过使用Ext.Ajax.request调用相同的网址并传递jsonData来完成此操作吗? (我相信那时我必须处理success回调中响应中的文件。

谢谢!

P.S。我在使用ExtJS 4.0

更新

早些时候我们只有GET请求下载文件但是为了支持新功能,我们必须先通过发送POST请求来自定义下载,然后API直接发送文件以响应POST请求。

但是正如评论中提到的rixo可能无法直接进行文件的异步下载,我不得不更改API,以便在POST请求中发送文件URL,然后我可以点击该URL并启动文件下载。鉴于它是巨大的企业网络应用程序影响数百万用户,主要使用IE,我想避免使用现代API(这显然很诱人,但在IE上不支持,像往常一样)。

2 个答案:

答案 0 :(得分:1)

您想在GET请求中添加请求正文吗?这不是GET协议的典型应用(虽然spec没有明确禁止),因此ExtJS不支持开箱即用。

您可以在ExtJS源代码(4.0.7)中看到GET请求的参数会自动附加到请求URI。

if ((method == 'GET' || data) && params) {
  url = Ext.urlAppend(url, params);
  params = null;
}

This answer has more details,但要点是“编写一个会为您重写请求的代理”。

答案 1 :(得分:0)

如果您只想下载文件,常见的方法是在文档中嵌入一个空的隐藏IFRAME,然后将“src”属性设置为get请求的URL。

这是一个很好的方式:

Download File Using Javascript/jQuery

这可以避免新标签或窗口打开时的整个问题。

这不能直接回答您的问题。但是,它确实解决了您的基本问题,即如何通过“RESTful”URL启动较少侵入性的文件下载。