Download file with ajax() POST request via Spring MVC

javascript, jquery, spring-mvc

Solution

Just send a URL of file in response and then "visit" it in your `success` callback.

function getLicenseFile() {
    $.ajax({
        type: 'POST',
        url: '<%=request.getContextPath()%>/licenses/rest/downloadLicenseFile',
        dataType: 'json',
        contentType: 'application/json;charset=UTF-8',
        data: ko.mapping.toJSON(licenseModel),
        success: function (data) {
            window.open(data.fileUrl);
            // or window.location.href = data.fileUrl;
        },
        error:function (xhr, ajaxOptions, thrownError) {
            console.log("in error");
        } 
    });
}

`data.fileUrl` should be set in response by server to say client where to get the file.

So your server will send a response with JSON like

{
    "fileUrl": "http://mysite.com/files/0123456789"
}

Problem

I try to download a file. The action is triggered by `ajax()` POST request. The request sends data in JSON format to the controller. The controller generates the file (bytes) and sends it back. JavaScript: ``` function getLicenseFile() { $.ajax({ type: 'POST', url: '<%=request.getContextPath()%>/licenses/rest/downloadLicenseFile', dataType: 'json', contentType: 'application/json;charset=UTF-8', data: ko.mapping.toJSON(licenseModel), success: function (data) { console.log("in sucess") }, error:function (xhr, ajaxOptions, thrownError){ console.log("in error") } }); } ``` Controller: ``` @RequestMapping(value = "/licenses/rest/downloadLicenseFile", method = RequestMethod.POST) @ResponseStatus(value=HttpStatus.OK) @ResponseBody public void createLicenseFile(@Valid @RequestBody License license, HttpServletResponse response) throws Exception { logger.debug("Contoller License in: "+ license); byte[] licensedata = licenseEncodeDefaultService.createLicenseFile(license); logger.debug("licenseData: " + new String(licensedata)); response.setHeader("Content-Disposition", "attachment; filename=\"" + license.getCustomer() + ".license\""); response.getOutputStream().write(licensedata); response.flushBuffer(); } ``` Problem - The Browser should open a download box, but it does not happen - The response is handled in the error: section of ajax function (but the HTTP Status is `OK`) So what do I do wrong or what is the proper way to do this?

Original source

Related problems