1 package jp.co.areaweb.tools.servlet;
\r
3 import javax.servlet.*;
\r
4 import javax.servlet.http.*;
\r
7 * サーバ上のファイル(やデータベース等に保存してあるデータ)をブラウザに送る場合は、適切なコンテントタイプをセットした
\r
9 * その際、ブラウザ側でどのように処理して欲しいかによって、「inline」と「attachment」の2つの形式があります。
\r
10 * inlineは送信内容がブラウザによってただちに表示されることを指し(*1)、attachmentはブラウザによってファイルに
\r
13 @SuppressWarnings("serial")
\r
14 public class FileDownloadServlet extends HttpServlet {
\r
15 // 拡張子contentType対応テーブル
\r
16 private final static String contentTypeTable[][] = {
\r
17 {"jpg", "image/pjpeg"},
\r
18 {"gif", "image/gif"},
\r
19 {"txt", "text/plain"},
\r
20 {"csv", "text/plain"},
\r
21 {"xml", "text/plain"},
\r
22 {"xsl", "text/plain"},
\r
23 {"xls", "application/vnd.ms-excel"}
\r
25 private final static int EXTENTION=0;
\r
26 private final static int CONTENT_TYPE=1;
\r
30 * fileName クライアント側の文字エンコーディングのままのファイル名
\r
33 * @throws javax.servlet.ServletException
\r
34 * @throws java.io.IOException
\r
37 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
\r
39 byte buffer[] = new byte[4096];
\r
41 // クライアント側の文字エンコーディングのままのファイル名
\r
42 String fileName1 = request.getParameter("fileName");
\r
43 // Unicodeに変更されたファイル名
\r
45 // 拡張子からcontentTypeを獲得
\r
46 String contentType = getContentType(fileName1);
\r
49 response.setContentType(contentType);
\r
51 File file = new File(fileName1);
\r
52 // ファイル名の送信(attachment部分をinlineに変更すればインライン表示)
\r
53 String fileName2 = new String(file.getName().getBytes("Windows-31J"), "ISO8859_1");
\r
54 //response.setCharacterEncoding("Windows-31J");
\r
55 response.setHeader("Content-disposition", "attachment; filename=\""+ fileName2 +"\"");
\r
57 ServletOutputStream out = response.getOutputStream();
\r
58 FileInputStream fin = new FileInputStream(file);
\r
60 while((size = fin.read(buffer))!=-1) {
\r
61 out.write(buffer,0, size);
\r
70 private String getExtention(String fileName) {
\r
71 int idx = fileName.lastIndexOf('.');
\r
73 return fileName.substring(idx+1, fileName.length());
\r
79 * 拡張子からcontentTypeを取り出す
\r
81 private String getContentType(String fileName) {
\r
82 String extention = getExtention(fileName);
\r
83 for (int j=0; j < contentTypeTable.length; j++) {
\r
84 if (contentTypeTable[j][EXTENTION].equalsIgnoreCase(extention)) {
\r
85 return contentTypeTable[j][CONTENT_TYPE];
\r
88 return "application/octet-stream";
\r