提问者:小点点

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


我有这样的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文件发送给用户。当我试图用超文本标记语言做到这一点时,一切都很好。

我做了一项研究,但发现没有什么帮助.有一些jQuery插件下载文件,但从URL喜欢:localhost/file.txt;我希望我的文件被下载,因为我说上,第一,另外发送数组与文件名到控制器。


共1个答案

匿名用户

我建议你使用这个JS插件https://github.com/johnculviner/jquery.fileDownload下载文件,而不是直接使用$. ajax。你可以在那里找到所有官方留档。

此外,在您的控制器中,您必须获取HttpServletResponse并在输出流中写入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);

    }