n-3104の備忘録
Servlet
最終更新:
n-3104
-
view
ファイルダウンロード
久しぶりに作ってみたら、30分ほどかかってしまったので、履歴として残しておこう。
それにしても、IEは挙動が安定していない。Content-Dispositionをattachmentにしていたにも関わらず、直接ServletのURLにアクセスしたらinlineとして解釈され、別の画面からPOSTする形でアクセスしたらattachmentととして動作した。その上、一度attachmentとして動作した後であれば直接アドレスにURLを入力してもattachmentとして動作したし。。やれやれだ。
いい機会なので、HTTPのResponseヘッダについても調べておこう。
それにしても、IEは挙動が安定していない。Content-Dispositionをattachmentにしていたにも関わらず、直接ServletのURLにアクセスしたらinlineとして解釈され、別の画面からPOSTする形でアクセスしたらattachmentととして動作した。その上、一度attachmentとして動作した後であれば直接アドレスにURLを入力してもattachmentとして動作したし。。やれやれだ。
いい機会なので、HTTPのResponseヘッダについても調べておこう。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FileDownloadServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = "test.txt"; // ヘッダの設定 response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); // 出力 ServletOutputStream out = response.getOutputStream(); System.out.println(new File(".").getAbsolutePath()); FileInputStream in = new FileInputStream("ファイルのフォルダパス" + fileName); byte[] buf = new byte[4096]; int size; while ((size = in.read(buf)) *= -1) { out.write(buf, 0, size); } in.close(); out.close(); } }
参考:http://www.stackasterisk.jp/tech/java/download01_01.jsp
ファイル名に日本語を使いたい場合はエンコーディングが必要になる。
ファイル名に日本語を使いたい場合はエンコーディングが必要になる。
ファイルアップロード
Commons FileUpload を使えば簡単に出来る。使い方は User Guide を見れば大体つかめる。
通常のフィールドがrequestからgetParameter出来ないのが面倒なくらい。Strutsを使うとこの辺を楽にしてくれる。
ちなみに、Commons FileUpload には Commons IO が必要。
通常のフィールドがrequestからgetParameter出来ないのが面倒なくらい。Strutsを使うとこの辺を楽にしてくれる。
ちなみに、Commons FileUpload には Commons IO が必要。
import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // ContentTypeを設定 response.setContentType("text/html; charset=Windows-31J"); // Check that we have a file upload request boolean isMultipart = ServletFileUpload.isMultipartContent(request); // Create a factory for disk-based file items FileItemFactory factory = new DiskFileItemFactory(); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Parse the request List /* FileItem */items = upload.parseRequest(request); // Process the uploaded items Iterator iter = items.iterator(); String fileName = null; while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { // 通常のフィールドの処理 } else { // ファイルの処理 fileName = new File(item.getName()).getName(); File uploadedFile = new File("C:/workspace/Servlet/upload/" + fileName); item.write(uploadedFile); } } // 出力用PrintWriterを取得 PrintWriter out = response.getWriter(); // 出力 out.println("<html>"); out.println("<head>"); out.println("<title>upload</title>"); out.println("</head>"); out.println("<body>"); out.println("アップロードに成功しました。<br>"); out.println("ファイル名:" + fileName); out.println("</body>"); out.println("</html>"); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } }