从反应到用户发送文件,弹簧安置+的jQuery(sending file from response

2019-10-21 16:49发布

我有春天控制器是这样的:

    @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']作为阿贾克斯的数据。现在,我想春天控制器找到这些文件,将它们打包到ZIP压缩包,并将其发送存档我作为字节[]响应)

下面是示例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一切S为好。

我已经做了研究,但没有发现任何有用的。 有哪些下载的文件的一些jQuery插件,但像URL:本地主机/ file.txt的; 我想,我说我上待下载文件和第一,另外与文件名控制器发送阵列。

Answer 1:

我建议你使用这个js插件https://github.com/johnculviner/jquery.fileDownload下载使用,而不是直接$阿贾克斯的文件。 你可以找到所有的官方文件。

此外,在你的控制器,你得把你的HttpServletResponse谱写OutputStream的字节[],你必须把一个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);

    }


文章来源: sending file from response to user, Spring REST + jQuery