web-dev-qa-db-ja.com

複数のファイルを含むZipファイルをダウンロードするためのSpring Boot Rest Service

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

これらのSpring MVC提供の抽象化を使用して、メモリ内のファイル全体のロードを回避します。 org.springframework.core.io.Resourceorg.springframework.core.io.InputStreamSource

この方法では、コントローラーインターフェイスを変更せずに、基盤となる実装を変更できます。また、ダウンロードはバイト単位でストリーミングされます。

受け入れられた回答 こちら を参照してください。これは基本的にorg.springframework.core.io.FileSystemResourceを使用してResourceを作成し、Zipファイルをオンザフライで作成するロジックもあります。

上記の回答の戻り値の型はvoidですが、ResourceまたはResponseEntity<Resource>を直接返す必要があります。

この答え で示されているように、実際のファイルをループしてZipストリームに入れます。 producesおよびcontent-typeヘッダーをご覧ください。

これら2つの答えを組み合わせて、達成しようとしていることを取得します。

1
Sabir Khan

これが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;
    }
}
5