Get response file use ExtJS

2019-02-22 17:23发布

问题:

I use ExtJS to build the client-side for my program. There's a situation that I want to send an Ajax request to server, and get the response file (binary file, not plain text file, i.e XLS or PDF). How can I get that returned file by ExtJS (I mean that file can be downloaded and stored to client)? I cannot use var result = Ext.decode(response.responseText) to receive the result because reponse contains binary data and it cannot be decoded.

The Ajax call is very simple :

Ext.Ajax.request({
    url : 'myController/exportFile',
    method : 'GET',
    success : function(response, opts) {
        // What should I do to get the file?
    },
    failure : function(response, opts) {
        alert('Export file failed!')
    }
});

Here is my server action to return file:

public void sendFile(HttpServletResponse response, String filePath) {
        def file = new File(filePath);
        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition", "attachment;filename=${file.getName()}");     
        response.outputStream << file.newInputStream();
    }

Thank you so much!

回答1:

If you need the user to be prompted with the typical browser provided open/save dialog box, you don't need to make this call AJAX.

Just linking to myController/exportFile from your page should be enough.
e.g. <a href="myController/exportFile">my file</a>

For this approach to work, HTTP response from myController/exportFile must include the appropriate headers (namely, Content-type and Content-disposition) that tell the browser "this is file. show open/save dialog" and based on your snippet, I see that you already have this taken care of.



回答2:

You can save your file to server's file-system and send window.open('http://your.domain/your/file') to client side... where http://your.domain/your/file -link to file