2013年6月25日火曜日

Servletでのファイルダウンロードのサンプルプログラム

ブラウザでリンクをクリックした時、サーブレットでレスポンスにファイルを入れ、ダウンロードを実施できるように実装するためのメモを記載したいと思います。

目次

  1. 前提条件
  2. サンプルプログラム
  3. サンプルプログラムの結果

前提条件

  • Windows XP Pro 32bit
  • Servlet3.0
  • JBoss As 7.1.1 Final
  • java 1.7.XX

サンプルプログラム

サーブレットでのファイルダウンロードのサンプルソースを以下に記載します。

package test;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;


@SuppressWarnings("serial")
@WebServlet(name = "download", urlPatterns = { "/download" })
public class Download extends HttpServlet {

 @Override
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  ServletOutputStream op = null;
  DataInputStream in     = null;
  String fileName = "テスト.txt";
  String filePath = "D:/temp/" + fileName;
  try {
   java.io.File file = new File(filePath);
   if (file.exists()) {
    //レスポンスヘッダーの作成
    response.setContentType("application/octet-stream");
    response.setContentLength((int) file.length());
    //ファイル名の設定ISO_8859_1にエンコード
    response.setHeader("Content-Disposition", "inline; filename=\"" 
                       + new String(fileName.getBytes("UTF-8"), "ISO_8859_1") + "\"");
    //ファイルの読み込み
    int bytes = 0;
    op = response.getOutputStream();
    byte[] bbuf = new byte[1024];
    in = new DataInputStream(new FileInputStream(file));
    while ((in != null) && ((bytes = in.read(bbuf)) != -1)) {
     op.write(bbuf, 0, bytes);
    }
    op.flush();
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally { 
   IOUtils.closeQuietly(in);
   IOUtils.closeQuietly(op);
  }
 }
}

サンプルプログラムの結果

上記のサンプルを実行すると以下のようになります

Written By : // 13:43
Category:

0 コメント:

コメントを投稿

 

About

このブログは筆者の備忘録として色々記載しています。

Blog Archive

Powered by Blogger.