【问题标题】:Initiate File Download via GET request通过 GET 请求启动文件下载
【发布时间】:2025-11-28 22:55:02
【问题描述】:

所以我有 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 数据作为请求正文传递(数据很大,所以我无法将其放入请求参数中)。

这可以通过使用Ext.Ajax.request 调用相同的URL 并传递jsonData 来完成吗? (我相信我必须在success回调中处理响应中的文件。

谢谢!

附:我在 ExtJS 4.0 上

更新

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

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

【问题讨论】:

  • 一些代理/防火墙丢弃 GET 请求的主体,一些 HTTP 服务器完全拒绝此类请求。我不会依赖那个。如果您不能依赖XHR level 2File API,那么您将无法使用 AJAX 下载文件。 Ext 还没有为你包装这个...

标签: javascript rest extjs download


【解决方案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,但要点是“编写一个代理来为你重写请求”。

【讨论】:

  • 我知道这不是严格遵循的 RESTful 模式,但这就是我们的 API 的工作方式。 ://
  • 对,代理是绕过 ExtJS 限制的一种方法。或者,您可以扩展其Ext.Ajax.request() 以便自己编写请求。在ExtJS request 中,发送到xhr 的send method 的参数被清空,如上所示。你只需要解决这个问题:-)
【解决方案2】:

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

这是一个不错的方法:

Download File Using Javascript/jQuery

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

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

【讨论】: