2014-02-06 129 views
1

启动文件下载所以我ExtJS的应用程序中,在组合一定的开放会导致下载文件(阅读:导出为PDF)。现在我们使用window.open来做到这一点,其中我们点击了一个特定的URL,这个URL在本质上和RESTful类似。通过GET请求

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

这打开了新的标签页,我得到要下载的文件。现在这在理论上是一个GET请求(虽然它没有出现在Chrome DevTools的“网络”选项卡中),并且我想将一些JSON数据作为请求主体(数据很大,因此无法在请求参数中适合它)传递。

可以通过调用使用Ext.Ajax.request并通过jsonData相同的URL来完成? (我相信,那我就必须处理文件中success回调中反应过来。

谢谢!

PS我对ExtJS的4.0

更新

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

但由于rixo在评论中提到,可能无法直接访问文件的异步下载,所以我必须更改API,以便在POST请求中发送文件URL,然后我可以点击该URL并启动文件下载。考虑到这是一个巨大的企业级网络应用,影响了大部分使用IE的数百万用户,我希望避免使用现代化的API(它们显然是诱人的,但在IE上不支持,就像往常一样)。

+5

某些代理/防火墙会丢弃GET请求的正文,而一些HTTP服务器完全拒绝这些请求。我不会依赖那个。如果你不能依靠[XHR level 2](http://caniuse.com/xhr2)和[File API](http://caniuse.com),那么你将无法使用AJAX下载该文件/ fileapi)。 Ext不会为你包装这个... – rixo

回答

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,但其要点是“写一个代理,将重写请求给你”。

+0

我明白它并非严格遵循RESTful模式,但这是我们的API的工作原理。 :/ – Kushal

+0

正确,而代理是解决ExtJS限制的一种方法。或者,您可以扩展它的'Ext.Ajax.request()'以便自己编写请求。在[ExtJS请求](http://docs.sencha.com/extjs/4.0.7/source/Connection.html#Ext-data-Connection-method-setOptions)中,发送给xhr的[para方法](http://www.w3.org/TR/2014/WD-XMLHttpRequest-20140130/#the-send%28%29-method)正在被取消,正如您在上面看到的。你只需修复:-) – Andrea

0

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

这里正是这样做的一个体面的方式:

Download File Using Javascript/jQuery

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

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