Spring Controller Not Returning File

2019-09-07 06:42发布

I have a simple Spring Controller setup to return a file (particularly a .CSV) via an AJAX Request. Here's my call which is utilizing YUI's framework which is making a standard XHR:

var downloadFile = Y.all('.downloadLink'); //traverses DOM for all downloadLink <a> tags
    downloadFile.on(
        'click',
        function(e){
            var fileName = e.currentTarget.attr('data-id');//retrieves file name
            Y.io.request(
            '/download/' + fileName, 
            {
                method: 'GET',
                on: {
                    success: function(e) {
                        alert('success');
                    },
                    failure: function(e) {
                        alert(e.type);
                    }
                 }
            });
    }); 

And here is my controller:

@RequestMapping( method = RequestMethod.GET, value = "/download/{fileName:.+}")
@ResponseBody
public FileSystemResource download(@PathVariable String fileName) throws IOException {
    File file = new File(rootPath + tempDir + '/' + fileName);
    try {
        if (file.exists()) {
            logger.info(fileName + " downloaded");
            return new FileSystemResource(file); 
        } else {
            logger.error("Could not download: " + fileName + " does not exist on server");
        }
    } catch (Exception e) {
        logger.error("Error Downloading File");
        e.printStackTrace();
    }
    return null;
}

As suggested in this question, I've tried forcing the download by modifying the method with

produces = MediaType.APPLICATION_OCTET_STREAM_VALUE

as well as including an HttpeServletResponse and setting the content type with

response.setContentType("application/force-download");

Without setting the MediaType, my request is successful and the @ResponseBody returns the contents of my file to the browser. However when I include the MediaType I receive a 406:

406 Not Acceptable: The resource identified by this request is only capable 
of generating responses with characteristics not acceptable according to the request "accept" headers.

I've searched the docs but I haven't found which "accepts" parameter I should be using to make this a valid request (if that alone would even resolve this issue). Any thoughts or suggested methods to retrieve my files? Cheers mates and Happy Easter

1条回答
啃猪蹄的小仙女
2楼-- · 2019-09-07 06:56

You need to set Accept header when you make a request. Never used YUI but try something like this

        Y.io.request(
        '/download/' + fileName, 
        {
            method: 'GET',
            on: {
                success: function(e) {
                    alert('success');
                },
                failure: function(e) {
                    alert(e.type);
                }
             }, 
            headers: {'Accept' : 'application/octet-stream'}
        });
查看更多
登录 后发表回答