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?