Download file with ajax() POST request via Spring MVC

后端 未结 5 736
予麋鹿
予麋鹿 2020-12-06 11:24

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 gener

5条回答
  •  醉酒成梦
    2020-12-06 12:00

    @will824 As you ask I'll post my own solution.

    I used a workaround in controller and save the file temporarily in the files ystem (/tmp). I split up the function in 2 steps. Creating and downloading. This is not very nice but good enough for me.

    Controller (creates a file, will be saved on the server file system):

    @RequestMapping(value = "/licenses/rest", method = RequestMethod.PUT)
    @ResponseStatus(value=HttpStatus.OK)
    @ResponseBody
    public String createLicenseFile(@Valid @RequestBody License license) throws Exception {
    
        // create encrypted license file and send the name back to view
        String fileName =  licenseEncodeDefaultService.createLicenseFile(license);
        return fileName;
    
    }
    

    Controller (downloads a file):

    @RequestMapping(value = "/licenses/downloadFile/{file}", method = RequestMethod.GET)
    public void downloadLicenseFile(@PathVariable("file") String file, HttpServletResponse response) throws Exception {
    
        // create full filename and get input stream
        File licenseFile = new File ("/tmp/" + file);
        InputStream is = new FileInputStream(licenseFile);
    
        // set file as attached data and copy file data to response output stream
        response.setHeader("Content-Disposition", "attachment; filename=\"" + file + ".license\"");
        FileCopyUtils.copy(is, response.getOutputStream());
    
        // delete file on server file system
        licenseFile.delete();
    
        // close stream and return to view
        response.flushBuffer();
    }
    

    JavaScript:

    function getLicenseFile() {
        //console.log(ko.mapping.toJSON(licenseModel));
        $.ajax({
            type : 'PUT',
            url : '${pageContext.request.contextPath}/licenses/rest',
            dataType : 'text',
            contentType : 'application/json;charset=UTF-8',
            data : ko.mapping.toJSON(licenseModel),
            success : function(data) {
                window.location.href = '${pageContext.request.contextPath}/licenses/downloadFile/'
                        + data;
            },
            error : function(xhr, ajaxOptions, thrownError) {
                // error handling
            }
        });
    }
    

提交回复
热议问题