我可以下载一个文件,但如何下载包含多个文件的zip文件。
下面是下载单个文件的代码,但我要下载多个文件。过去两天来我一直坚持不懈,对此将不胜感激。
@GET
@Path("/download/{fname}/{ext}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response downloadFile(@PathParam("fname") String fileName,@PathParam("ext") String fileExt){
File file = new File("C:/temp/"+fileName+"."+fileExt);
ResponseBuilder rb = Response.ok(file);
rb.header("Content-Disposition", "attachment; filename=" + file.getName());
Response response = rb.build();
return response;
}
答案 0 :(得分:3)
这是我使用过的工作代码response.getOuptStream()
if exists (select * from TEP_Payments_Table where [Project Name] = 'test')
select top 1 [Project Name] from TEP_Payments_Table where [Project Name] = 'test' order by payid desc
else
select 'None'
公共类DownloadFileController {
@RestController
}
服务等级:-
公共类DownloadServiceImpl实现DownloadService {
@Autowired
DownloadService service;
@GetMapping("/downloadZip")
public void downloadFile(HttpServletResponse response) {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=download.zip");
response.setStatus(HttpServletResponse.SC_OK);
List<String> fileNames = service.getFileName();
System.out.println("############# file size ###########" + fileNames.size());
try (ZipOutputStream zippedOut = new ZipOutputStream(response.getOutputStream())) {
for (String file : fileNames) {
FileSystemResource resource = new FileSystemResource(file);
ZipEntry e = new ZipEntry(resource.getFilename());
// Configure the zip entry, the properties of the file
e.setSize(resource.contentLength());
e.setTime(System.currentTimeMillis());
// etc.
zippedOut.putNextEntry(e);
// And the content of the resource:
StreamUtils.copy(resource.getInputStream(), zippedOut);
zippedOut.closeEntry();
}
zippedOut.finish();
} catch (Exception e) {
// Exception handling goes here
}
}
答案 1 :(得分:0)
使用这些Spring MVC提供的抽象来避免将整个文件加载到内存中。
org.springframework.core.io.Resource
和org.springframework.core.io.InputStreamSource
这样,您的底层实现可以更改而无需更改控制器接口,而且下载内容将逐字节传输。
请参阅已接受的答案here,该答案基本上是使用org.springframework.core.io.FileSystemResource
创建Resource
的,也有一种逻辑上可以即时创建zip文件的逻辑。
以上答案的返回类型为void
,而您应直接返回Resource
或ResponseEntity<Resource>
。
如this answer中所示,循环您的实际文件并放入zip流中。看一下produces
和content-type
标头。
将这两个答案结合起来,以获得您想要实现的目标。
答案 2 :(得分:0)
public void downloadSupportBundle(HttpServletResponse response){
File file = new File("supportbundle.tar.gz");
Path path = Paths.get(file.getAbsolutePath());
logger.debug("__path {} - absolute Path{}", path.getFileName(),
path.getRoot().toAbsolutePath());
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=supportbundle.tar.gz");
response.setStatus(HttpServletResponse.SC_OK);
System.out.println("############# file name ###########" + file.getName());
try (ZipOutputStream zippedOut = new ZipOutputStream(response.getOutputStream())) {
FileSystemResource resource = new FileSystemResource(file);
ZipEntry e = new ZipEntry(resource.getFilename());
e.setSize(resource.contentLength());
e.setTime(System.currentTimeMillis());
zippedOut.putNextEntry(e);
StreamUtils.copy(resource.getInputStream(), zippedOut);
zippedOut.closeEntry();
zippedOut.finish();
} catch (Exception e) {
}
}