How can I return a Zip file from my Java server-side using JAX-RS?

后端 未结 4 551
自闭症患者
自闭症患者 2021-01-19 04:12

I want to return a zipped file from my server-side java using JAX-RS to the client.

I tried the following code,

@GET
public Response get() throws Exc         


        
相关标签:
4条回答
  • 2021-01-19 04:39

    In Jersey 2.16 file download is very easy

    Below is the example for the ZIP file

    @GET
    @Path("zipFile")
    @Produces("application/zip")
    public Response getFile() {
        File f = new File(ZIP_FILE_PATH);
    
        if (!f.exists()) {
            throw new WebApplicationException(404);
        }
    
        return Response.ok(f)
                .header("Content-Disposition",
                        "attachment; filename=server.zip").build();
    }
    
    0 讨论(0)
  • 2021-01-19 04:39

    I'm not sure I it's possible in Jersey to just return a stream as result of annotated method. I suppose that rather stream should be opened and content of the file written to the stream. Have a look at this blog post. I guess You should implement something similar.

    0 讨论(0)
  • 2021-01-19 04:45

    You can write the attachment data to StreamingOutput class, which Jersey will read from.

    @Path("/report")
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public Response generateReport() {
        String data = "file contents"; // data can be obtained from an input stream too.
        StreamingOutput streamingOutput = outputStream -> {
            ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(outputStream));
            ZipEntry zipEntry = new ZipEntry(reportData.getFileName());
            zipOut.putNextEntry(zipEntry);
            zipOut.write(data); // you can set the data from another input stream
            zipOut.closeEntry();
            zipOut.close();
            outputStream.flush();
            outputStream.close();
        };
    
        return Response.ok(streamingOutput)
                .type(MediaType.TEXT_PLAIN)
                .header("Content-Disposition","attachment; filename=\"file.zip\"")
                .build();
    }
    
    0 讨论(0)
  • 2021-01-19 04:51

    You are delegating in Jersey the knowledge of how to serialize the ZipOutputStream. So, with your code you need to implement a custom MessageBodyWriter for ZipOutputStream. Instead, the most reasonable option might be to return the byte array as the entity.

    Your code looks like:

    @GET
    public Response get() throws Exception {
        final File file = new File(filePath);
    
        return Response
                .ok(FileUtils.readFileToByteArray(file))
                .type("application/zip")
                .header("Content-Disposition", "attachment; filename=\"filename.zip\"")
                .build();
    }
    

    In this example I use FileUtils from Apache Commons IO to convert File to byte[], but you can use another implementation.

    0 讨论(0)
提交回复
热议问题