1つのファイルをダウンロードできますが、複数のファイルを含むZipファイルをダウンロードするにはどうすればよいですか。
以下は、単一のファイルをダウンロードするコードですが、ダウンロードするファイルが複数あります。過去2日間、これにこだわっているので、どんな助けでも大歓迎です。
@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;
}
これらのSpring MVC提供の抽象化を使用して、メモリ内のファイル全体のロードを回避します。 org.springframework.core.io.Resource
&org.springframework.core.io.InputStreamSource
この方法では、コントローラーインターフェイスを変更せずに、基盤となる実装を変更できます。また、ダウンロードはバイト単位でストリーミングされます。
受け入れられた回答 こちら を参照してください。これは基本的にorg.springframework.core.io.FileSystemResource
を使用してResource
を作成し、Zipファイルをオンザフライで作成するロジックもあります。
上記の回答の戻り値の型はvoid
ですが、Resource
またはResponseEntity<Resource>
を直接返す必要があります。
この答え で示されているように、実際のファイルをループしてZipストリームに入れます。 produces
およびcontent-type
ヘッダーをご覧ください。
これら2つの答えを組み合わせて、達成しようとしていることを取得します。
これがresponse.getOuptStream()を使用した私の作業コードです
@RestController
public class DownloadFileController {
@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
}
}
}
サービスクラス:-
public class DownloadServiceImpl implements DownloadService {
@Autowired
DownloadServiceDao repo;
@Override
public List<String> getFileName() {
String[] fileName = { "C:\\neon\\FileTest\\File1.xlsx", "C:\\neon\\FileTest\\File2.xlsx", "C:\\neon\\FileTest\\File3.xlsx" };
List<String> fileList = new ArrayList<>(Arrays.asList(fileName));
return fileList;
}
}