###知りたいこと
JavaEE(Servlet or JAX-RS)で数GBレベルのファイルを
ダウンロードする機能を作っています。大容量データのため、
Transfer-Encodingヘッダを設定する必要があると思っています。
WebサーバをIIS or Apache、APサーバをJavaEE準拠の
アプリケーションサーバで作成しようと思っています。
この構成の場合、Transfer-Encodingヘッダは、
WebサーバそれともAPサーバ、もしくは自作するアプリケーション
(Servlet or JAX-RS)どこで設定するものなのでしょうか。
ちなみに、Embedded GlassFish All In One 3.1.1で
プロトタイプ作ってみました。
動作確認したところHTTPレスポンスヘッダは下記の通り設定され
Transfer-Encodingヘッダが設定されています。
自作するアプリケーション(Servlet or JAX-RS)では
設定していないので、GlassFishのどこかで設定されているようです。
HTTP/1.1 200 OK X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.1 Java/Oracle Corporation/1.8) Server: GlassFish Server Open Source Edition 3.1.1 Content-Disposition: attachment; filename="test.zip" Transfer-Encoding: chunked Date: Sat, 23 Jan 2016 06:40:32 GMT
###ソースコード:自作したアプリケーション(Servlet or JAX-RS)
####Servlet
Java
1@WebServlet("/servlet/download") 2public class Download extends HttpServlet { 3 private static final long serialVersionUID = 1L; 4 5 /** 6 * @see HttpServlet#HttpServlet() 7 */ 8 public Download() { 9 super(); 10 // TODO Auto-generated constructor stub 11 } 12 13 /** 14 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 15 */ 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 final File file = new File("xxx.zip"); 18 OutputStream output = response.getOutputStream(); 19 20 InputStream input= new FileInputStream(file); 21 response.setHeader("Content-Disposition", "attachment; filename=\"test.zip\""); 22 writeOutput(output,input); 23 24 input.close(); 25 } 26 27 private void writeOutput(OutputStream output,InputStream is) throws IOException{ 28 byte[] buf = new byte[1000]; 29 int i = 0; 30 for (int nChunk = is.read(buf); nChunk!=-1; nChunk = is.read(buf)) 31 { 32 System.out.println("writeOutput[" + ++i + "]"); 33 output.write(buf, 0, nChunk); 34 } 35 } 36} 37
####JAX-RS
Java
1@Path("/download") 2public class Download { 3 @GET 4 @Produces("application/zip") 5 public Response get(){ 6 final File file = new File("xxx.zip"); 7 8 StreamingOutput stream = new StreamingOutput(){ 9 @Override 10 public void write(java.io.OutputStream os) throws IOException, WebApplicationException { 11 InputStream is= new FileInputStream(file); 12 byte[] buf = new byte[1000]; 13 for (int nChunk = is.read(buf); nChunk!=-1; nChunk = is.read(buf)) 14 { 15 os.write(buf, 0, nChunk); 16 } 17 is.close(); 18 } 19 }; 20 21 return Response 22 .status(Response.Status.OK) 23 .header("Content-Length",file.length()) 24 .header("Content-Disposition", "attachment; filename=\"test.zip\"") 25 .entity(stream) 26 .build(); 27 } 28}
###補足情報(言語/FW/ツール等のバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/13 05:29