In this example we are going to see how you can download a file from a JAX-RS REST Service. It's easy to do that, as it requires to annotate the bind method with the
@Produces annotation. The @Produces annotation can used to used to specify the MIME media types a service can produce and send to the client. In this example we are going to see how you can download text, image, PDF and excel files.
The second thing to note is that you have to attach the file to the response and then set the
Content-Disposition header variable of the response. The Content-Disposition response-header field is used to dictate a a default file name if the user requests that the content is saved to a file. A simple example would be : Content-Disposition: attachment; filename="fname.ext". Using this, the user-agent will not display the response, but directly the pop up "Save as…" dialogue.
To download different file formats all you have to do is change the type registered in
@Produces annotation.@Produces("image/png")for images (you can change the "png" part according to the format of the image).@Produces("application/pdf")for PDF files.@Produces("application/vnd.ms-excel")for Excel files.
import java.io.File;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
@Path("/files")
public class HelloWorldREST {
// The file paths of the files in the server
private static final String TXT_FILE = "C:\\test.txt";
private static final String IMAGE_FILE = "C:\\test.png";
private static final String PDF_FILE = "C:\\test.pdf";
private static final String EXCEL_FILE = "C:\\test.xls";
/**
* Download Text File
*/
@GET
@Path("/txt")
@Produces("text/plain")
public Response getTextFile() {
File file = new File(TXT_FILE);
ResponseBuilder response = Response.ok((Object) file);
response.header("Content-Disposition", "attachment; filename=\"test_text_file.txt\"");
return response.build();
}
/**
* Download Image File
*/
@GET
@Path("/images")
@Produces("image/png")
public Response getImageFile() {
File file = new File(IMAGE_FILE);
ResponseBuilder response = Response.ok((Object) file);
response.header("Content-Disposition", "attachment; filename=\"test_image_file.png\"");
return response.build();
}
/**
* Download PDF File
*/
@GET
@Path("/pdf")
@Produces("application/pdf")
public Response getPDF() {
File file = new File(PDF_FILE);
ResponseBuilder response = Response.ok((Object) file);
response.header("Content-Disposition", "attachment; filename=\"test_PDF_file.pdf\"");
return response.build();
}
/**
* Download Excel File
*/
@GET
@Path("/excel")
@Produces("aapplication/vnd.ms-excel")
public Response getExcell() {
File file = new File(EXCEL_FILE);
ResponseBuilder response = Response.ok((Object) file);
response.header("Content-Disposition", "attachment; filename=\"test_excel_file.xls\"");
return response.build();
}
}
Web Start: Invalid thread access
Web Start: Invalid thread access with SWT APPS in MAC
Checked this in last night for our Java 1.5 in Leopard. To use this, you will need to let the JVM know you're going to use the SWT: <resources os="Mac OS X"> <j2se version="1.5*" java-vm-args="-XstartOnFirstThread"/> <jar href="SWTWebStart.jar"/> </resources> I will move to resolved/fixed when a public build with this fix is available.Sorry, my previous comment wasn't clear: <resources os="Mac OS X"> .... <j2se version="1.5*" java-vm-args="-XstartOnFirstThread"/> .... </resources> The 'java-vm-args="-XstartOnFirstThread"' is the important part. The next public build of Leopard 1.5 will have this support, which is why I wrote the resources section this way. The JAR file was from a local test, and not relevant here. I still need to merge it into 1.6, but I'm also not commenting when that will be released. I'll update here when that happens.