我有这样的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;我希望我的文件可以下载,因为我说上面和第一个,另外发送带有文件名的数组到控制器。
答案 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);
}