从响应发送文件到用户,Spring REST + jQuery

时间:2015-01-25 11:24:28

标签: jquery ajax spring rest zip

我有这样的Spring控制器:

    @RequestMapping(value = "/download", method = RequestMethod.GET)
    public byte[] getFilesInZIP(@RequestParam("filenames[]") String[] filenames){
        byte[] file = service.packFilesToZIPArchiveAndReturnAsByteArray(filenames);
        return file;
    }

现在当我创建前端时,我想将包含文件名的数组发送到控制器并下载包含我选择的文件的ZIP存档。

要明确:我们假设我要下载3个文件: a.txt,b.txt和c.txt ;我使用jquery发送了AJAX请求使用数组: ['a.txt','b.txt','c.txt'] 作为ajax数据。现在我希望spring控制器找到这些文件,将它们打包到 ZIP 存档并将此存档作为响应中的byte []发送给我

以下是jQuery代码示例:

        var tab = ['a.txt', 'b.txt', 'c.txt'];
        jQuery.ajax({
            url: "http://localhost:8080/download",
            type: "GET",
            data: {
                'filenames': tab
            },
            error : function(jqXHR, textStatus, errorThrown) {
                alert('problem');
            }
        });

但我不知道如何处理此响应以将此存档ZIP文件发送给用户。当我尝试使用HTML中的一切时,一切都很好。

我做了一项研究,但没有发现任何有用的信息。有一些jQuery插件可以下载文件,但是来自URL:localhost / file.txt;我希望我的文件可以下载,因为我说上面和第一个,另外发送带有文件名的数组到控制器。

enter image description here

1 个答案:

答案 0 :(得分:0)

我建议您使用此JS插件https://github.com/johnculviner/jquery.fileDownload直接使用$ .ajax下载文件。你可以在那里找到所有的官方文件。

此外,在您的控制器中,您必须使用HttpServletResponse并在outputstream中写入byte [],并且您必须在响应中放置一个cookie来建议JS插件(因为它需要它)

例如:

@RequestMapping(value = "/download", method = RequestMethod.GET)
    public void getFilesInZIP(@RequestParam("filenames[]") String[] filenames, HttpServletResponse httpServletResponse){
        byte[] file = service.packFilesToZIPArchiveAndReturnAsByteArray(filenames);

        Cookie cookie = new Cookie("fileDownload", "true");
        cookie.setPath("/");

        httpServletResponse.addCookie(cookie);
        httpServletResponse.setContentType("application/zip");
        httpServletResponse.setHeader("Content-Disposition", "attachment;filename=files.zip");
        httpServletResponse.getOutputStream().write(file);

    }