Je peux télécharger un seul fichier mais comment télécharger un fichier Zip contenant plusieurs fichiers.
Voici le code pour télécharger un seul fichier mais j'ai plusieurs fichiers à télécharger. Toute aide serait grandement appréciée car je suis coincé à ce sujet depuis 2 jours.
@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;
}
Utilisez ces abstractions fournies par Spring MVC pour éviter de charger tout le fichier en mémoire. org.springframework.core.io.Resource
& org.springframework.core.io.InputStreamSource
De cette façon, votre implémentation sous-jacente peut changer sans changer l'interface du contrôleur et également vos téléchargements seront diffusés octet par octet.
Voir la réponse acceptée ici qui utilise essentiellement org.springframework.core.io.FileSystemResource
pour créer un Resource
et il existe également une logique pour créer un fichier Zip à la volée.
Cette réponse ci-dessus a le type de retour comme void
, tandis que vous devez directement renvoyer un Resource
ou ResponseEntity<Resource>
.
Comme démontré dans cette réponse , parcourez vos fichiers réels et mettez-les en flux Zip. Jetez un œil à produces
et content-type
en-têtes.
Combinez ces deux réponses pour obtenir ce que vous essayez d'accomplir.
Voici mon code de travail, j'ai utilisé 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
}
}
}
Classe de service: -
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;
}
}