OSDN Git Service

2019-02-11
[hayashilib/hayashi.git] / src / jp / co / areaweb / tools / servlet / FileDownloadServlet.java
1 package jp.co.areaweb.tools.servlet;\r
2 import java.io.*;\r
3 import javax.servlet.*;\r
4 import javax.servlet.http.*;\r
5 \r
6 /**\r
7  * サーバ上のファイル(やデータベース等に保存してあるデータ)をブラウザに送る場合は、適切なコンテントタイプをセットした\r
8  * 後にファイル内容を送信します。\r
9  * その際、ブラウザ側でどのように処理して欲しいかによって、「inline」と「attachment」の2つの形式があります。\r
10  * inlineは送信内容がブラウザによってただちに表示されることを指し(*1)、attachmentはブラウザによってファイルに\r
11  * 保存されます。\r
12  */\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
24         };\r
25         private final static int EXTENTION=0;\r
26         private final static int CONTENT_TYPE=1;\r
27 \r
28         /**\r
29          * パラメータ:\r
30          *      fileName        クライアント側の文字エンコーディングのままのファイル名\r
31      * @param request\r
32      * @param response\r
33      * @throws javax.servlet.ServletException\r
34      * @throws java.io.IOException\r
35          */\r
36         @Override\r
37         public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {\r
38                 // ファイル読み込み用バッファ\r
39                 byte buffer[]  = new byte[4096];\r
40                 \r
41                 // クライアント側の文字エンコーディングのままのファイル名\r
42                 String fileName1 = request.getParameter("fileName");\r
43                 // Unicodeに変更されたファイル名\r
44                 \r
45                 // 拡張子からcontentTypeを獲得\r
46                 String contentType = getContentType(fileName1);\r
47                 \r
48                 // contentTypeを出力\r
49                 response.setContentType(contentType);\r
50                 \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
56                 // ファイル内容の出力\r
57                 ServletOutputStream out = response.getOutputStream();\r
58                 FileInputStream fin = new FileInputStream(file);\r
59                 int size;\r
60                 while((size = fin.read(buffer))!=-1) {\r
61                         out.write(buffer,0, size);\r
62                 }\r
63                 fin.close();\r
64                 out.close();\r
65         }\r
66 \r
67         /**\r
68          *  ファイル名から拡張子を取り出す\r
69          */\r
70         private String getExtention(String fileName) {\r
71                 int idx = fileName.lastIndexOf('.');\r
72                 if (idx!=-1) {\r
73                         return fileName.substring(idx+1, fileName.length());\r
74                 }\r
75                 return "";\r
76         }\r
77 \r
78         /**\r
79          *  拡張子からcontentTypeを取り出す\r
80          */\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
86                         }\r
87                 }\r
88                 return "application/octet-stream";\r
89         }\r
90 }\r