web-dev-qa-db-fra.com

Service Spring boot rest pour télécharger un fichier Zip contenant plusieurs fichiers

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;
}
4
abhishek chauhan

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.

1
Sabir Khan

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;
    }
}
5
abhishek chauhan