2013年2月6日 星期三

在 JAX-RS 實現上傳檔案及下載檔案

在 JAX-RS 的環境中,如果遇到需要自行客製化回應的訊息時,可以利用 javax.ws.rs.core.Response 物件來實現。

以下載檔案來說,範例如下:
@Path("/file")
@Provider
public class FileProcessing {
  @GET
  @Path("/get")
  @Produces(MediaType.APPLICATION_OCTET_STREAM)
  public Response getFile () {
    Response response = null;
    
    File p12File = new File("/home/user/test");
    byte[] bytes = StreamReader.get(p12File);
    if(bytes != null) {
      response = Response.
          ok(bytes, MediaType.APPLICATION_OCTET_STREAM_TYPE).
          header("content-disposition", "attachment; filename=" + p12File.getName()).
          header("content-MD5", this.getMd5Hash(p12File)).
          build();
    } else {
      response = Response.serverError().status(404).build();
    }
    return response;
  }
}
簡單來說,就是用 Response 物件的 ResponseBuilder 來建立一個客製化的 Response
需要塞什麼資料都可以透過 ResponseBuilder.ok() 把東西放進去~
然後在 ResponseBuilder.header() 方法去指定 Response 中需要的 Header(當然不放也可以)。

其中在範例程式碼中,StreamReader.get() 是我自己寫的小工具,目的就只是把 File 轉成 byte array 回傳而已。

上傳檔案的方法也很類似,在宣告 Method 時指定 @Consumes 的標記,然後取得 InputStream 後把 Stream 寫入到檔案即可。

參考資料:
1、Return a file using Java Jersey
2、Reading HttpURLConnection InputStream - manual buffer or BufferedInputStream?
3、File Upload Example In Jersey

沒有留言: