There are a lot of tutorials out there explaining how to send binary data (i.e. application/octet-stream) as response for Jersey web services (Java JAX-RS). Two possible solutions are based on either returning a Response or StreamingObject containing the appropriate binary data stream.
Below you find a simple example for both scenarios:
//either inject response via context
@Context
private HttpServletResponse response;
//or return Response as shown below
/**
*
* @param content
* @return
*/
@GET
@Path("/attachment")
@Consumes("text/plain; charset=UTF-8")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getAttachment(
@QueryParam("file") String fileName) {
try {
if (fileName == null) {
System.err.println("No such item");
return Response.status(Response.Status.BAD_REQUEST).build();
}
// either set response injected above
//response.setContentType("image/png");
//response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
//TODO: write file content to response.getOutputStream();
//response.getOutputStream().close();
//return response;
// OR: use a custom StreamingOutput and set to Response
StreamingOutput stream = new StreamingOutput() {
@Override
public void write(OutputStream output) throws IOException {
try {
// TODO: write file content to output;
} catch (Exception e) {
e.printStackTrace();
}
}
};
return Response.ok(stream, "image/png") //TODO: set content-type of your file
.header("content-disposition", "attachment; filename = "+ fileName)
.build();
}
}
System.err.println("No such attachment");
return Response.status(Response.Status.BAD_REQUEST).build();
} catch (Exception e) {
System.err.println(e.getMessage());
return Response.status(Response.Status.BAD_REQUEST).build();
}
}
Additional checks have been ommitted for better readability. You should definitely check parameter fileName and not use it directly to serve files 😉
Pretty easy, right?
