JSP ファイルのアップロードとダウンロード

⚡ スマートサマリー

JSPにおけるファイルアップロードとダウンロードは、Webアプリケーションがユーザーからファイルを受け取り、ユーザーにファイルを返すための基本的な入出力操作です。この資料では、JSPアクションフォーム、Apache Commons FileUpload、およびサーブレットクラスを使用して、これらの操作フローを完全な動作コードとともに解説します。

  • 📤 アップロードの基本: ファイルアップロードにはPOSTメソッドを使用し、enctypeをmultipart/form-dataに設定してください。
  • 🧩 Apache コモンズ: DiskFileItemFactoryとServletFileUploadは、マルチパートリクエストをファイルアイテムに解析します。
  • 🗂️ サーブレットの処理: doPostメソッドはファイル項目を反復処理し、それぞれをターゲットフォルダに書き込みます。
  • 📥 ダウンロードフロー: サーブレットは、FileInputStreamとContent-Dispositionヘッダーを使用してファイルをストリーミングします。
  • ⚙️ 構成: ファイルの読み書きを行う前に、ファイルパス、サイズ制限、およびコンテンツタイプを設定する必要があります。

JSP ファイルのアップロードとダウンロード

JSPファイルのアップロード

  • JSP を使用して任意のファイルをアップロードできます。
  • テキスト ファイル、バイナリ ファイル、画像ファイル、またはその他のドキュメントを使用できます。
  • ここでファイルをアップロードする場合、POST メソッドのみが使用され、GET メソッドは使用されません。
  • Enctype 属性は multipart/form-data に設定する必要があります。

例: アクションの使用

この例では、IOオブジェクトを使用してファイルをアップロードしています。

アクションファイル.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru File</title>
</head>
<body>
<a>Guru File Upload:</a>
Select file: <br />
<form action="action_file_upload.jsp" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>

アクションファイルアップロード.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import="java.io.*,java.util.*, javax.servlet.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.apache.commons.io.output.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru File Upload</title>
</head>
<body>
<%
   File file ;
   int maxFileSize = 5000 * 1024;
   int maxMemSize = 5000 * 1024;
   String filePath = "E:/guru99/data";

   String contentType = request.getContentType();
   if ((contentType.indexOf("multipart/form-data") >= 0)) {

      DiskFileItemFactory factory = new DiskFileItemFactory();
      factory.setSizeThreshold(maxMemSize);
      factory.setRepository(new File("c:\\temp"));
      ServletFileUpload upload = new ServletFileUpload(factory);
      upload.setSizeMax( maxFileSize );
      try{
         List fileItems = upload.parseRequest(request);
         Iterator i = fileItems.iterator();
         out.println("<html>");
         out.println("<body>");
         while ( i.hasNext () )
         {
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () )  {
                String fieldName = fi.getFieldName();
                String fileName = fi.getName();
                boolean isInMemory = fi.isInMemory();
                long sizeInBytes = fi.getSize();
                file = new File( filePath + "yourFileName") ;
                fi.write( file ) ;
                out.println("Uploaded Filename: " + filePath + fileName + "<br>");
            }
         }
         out.println("</body>");
         out.println("</html>");
      }catch(Exception ex) {
         System.out.println(ex);
      }
   }else{
      out.println("<html>");
      out.println("<body>");
      out.println("<p>No file uploaded</p>");
      out.println("</body>");
      out.println("</html>");
   }
%>
</body>
</html>

コードの説明:

アクションファイル.jsp

Code 12〜18行目: ここでは、ファイルをサーバーにアップロードするファイルフィールドを持つフォームを作成し、アクションをaction_file_upload.jspに渡します。

アクションファイルアップロード.jsp

Code ライン20: ここでは、特定のパスにファイルパスを指定しています。

Code 23〜38行目: ここでは、コンテンツタイプがmultipart/form-dataかどうかを確認します。もしそうであれば、コンテンツはファイルタイプであり、読み込まれます。ファイルが読み込まれた後、一時ファイルに書き込まれ、その後、一時ファイルがメインファイルに変換されます。

上記のコードを実行すると、次の出力が得られます。

JSPファイルのアップロード

出力:

ファイル選択ボタンを使用してファイルをアップロードすると、ファイルアップロードボタンによって指定されたパスにファイルがサーバーにアップロードされます。

例: JSP操作の使用

この例では、JSP操作を使用してファイルをアップロードします。「アップロード」ボタンのあるフォームを用意し、そのボタンをクリックするとファイルがアップロードされるようにします。

アップロード_1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Uploading File</title>
</head>
<body>
File: <br />
<form action="guru_upload" method="post"
                        enctype="multipart/form-data">
<input type="file" name="guru_file" size="50" />
<br />
<input type="submit" value="Upload" />
</form>
</body>
</html>

コードの説明:

Code 11〜12行目: ここでは、サーブレット guru_upload にアクションを持つフォームを使用しており、POST メソッドでデータが渡されます。また、enctype 属性は、フォームデータをどのようにエンコードしてサーバーに送信するかを指定するもので、POST メソッドでのみ使用されます。ここでは、ファイル(データサイズが大きい場合)用に multipart/form-data に設定しています。

Code ライン13: ここでは、guru_file要素をタイプfileとして指定し、サイズを50としています。

Code ライン15: これは「アップロード」という名前の送信ボタンで、このボタンをクリックするとアクションサーブレットが呼び出され、リクエストが処理され、ファイルがサーブレットに読み込まれて書き込まれます。

Guru_upload.java

package demotest;

import java.io.File;
import java.io.IOException;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class guru_upload extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public guru_upload() {
        super();
        // TODO Auto-generated constructor stub
    }
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		        if(ServletFileUpload.isMultipartContent(request)){
		            try {
		                List <FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
		                for(FileItem item : multiparts){
		                    if(!item.isFormField()){
		                        String name = new File(item.getName()).getName();
		                        item.write( new File("c:/guru/upload" + File.separator + name));
		                    }
		                }
		               //File uploaded successfully
		               request.setAttribute("gurumessage", "File Uploaded Successfully");
		            } catch (Exception ex) {
		               request.setAttribute("gurumessage", "File Upload Failed due to " + ex);
		            }
		        }else{

		            request.setAttribute("gurumessage","No File found");
 }
		        request.getRequestDispatcher("/result.jsp").forward(request, response);

		    }


}

コードの説明:

Code 12〜14行目: ここでは、コードの設定にorg.apache.commonsライブラリをインポートする必要があります。また、org.apache.commonsライブラリからfileuploadクラスをインポートする必要があります。

Code ライン23: ここでは、JSPでPOSTメソッドを渡す際に呼び出されるdoPost()メソッドがあり、リクエストオブジェクトとレスポンスオブジェクトをパラメータとして受け取ります。

Code ライン26: ここでは、org.apache.commonsライブラリのfileUploadパッケージにあるServletFileUploadクラスのオブジェクトを作成します。このオブジェクトは、JSP内にファイルオブジェクトが存在するかどうかを確認します。ファイルオブジェクトが見つかった場合は、リクエストからそれらのファイルオブジェクトを取得します。

Code 27〜32行目: 複数のファイルをアップロードする場合、リストオブジェクトである multiparts オブジェクトに含まれるファイル項目の数をチェックすることで、ファイル数を順に処理し、指定されたファイル名で c:/guru/upload フォルダに保存します。ファイルの書き込みには、ファイルオブジェクトの write メソッドを使用します。

Code ライン34: 例外が発生しない場合は、リクエストに「ファイルが正常にアップロードされました」という値を持つ属性「gurumessage」を設定します。

Code 35〜36行目: 例外が発生した場合は、「ファイルのアップロードに失敗しました」というメッセージを表示します。

Code ライン40: ファイルが見つからない場合は、「ファイルが見つかりません」というメッセージを表示します。

Code ライン42: requestdispatcherオブジェクトを使用して、リクエストオブジェクトとレスポンスオブジェクトとともにリクエストをresult.jspに転送します。

結果.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Result</title>
</head>
<body>
<% String msg = (String)request.getAttribute("message");
   out.println(msg);
%>
</body>
</html>

コードの説明:

Code ライン10: ここでは、リクエストオブジェクトから値「gurumessage」を持つ属性を取得し、文字列オブジェクトに格納しています。

Code ライン11: ここではそのメッセージを出力しています。

上記のコードを実行すると、次の出力が得られます。

出力:

ファイルを選択するための入力欄があるフォームが表示されます。ファイルを選択したら、アップロードボタンをクリックする必要があります。

JSP操作を使用したファイルのアップロード

アップロードボタンをクリックすると、ファイルが正常にアップロードされたというメッセージが表示されます。

JSP操作を使用したファイルのアップロード

下の図から、ファイルがc:/guru/uploadフォルダにアップロードされたことがわかります。

JSP操作を使用したファイルのアップロード

JSP ファイルのダウンロード

この例では、ボタンをクリックしてディレクトリからファイルをダウンロードします。

ダウンロード_1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Downloading Guru Example</title>
</head>
<body>
Guru Downloading File<a href="guru_download">Download here!!!</a>
</body>
</html>

コードの説明:

Code ライン10: ここでは、サーブレット guru_download を使用して、c:/guru/upload フォルダーからファイルをダウンロードするためのリンクを提供しています。

Guru_download.java

package demotest;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class guru_download
 */
public class guru_download extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		String gurufile = "test.txt";
		String gurupath = "c:/guru/upload/";
		response.setContentType("APPLICATION/OCTET-STREAM");
		response.setHeader("Content-Disposition", "attachment; filename=\""
				+ gurufile + "\"");

		FileInputStream fileInputStream = new FileInputStream(gurupath
				+ gurufile);

		int i;
		while ((i = fileInputStream.read()) != -1) {
			out.write(i);
		}
		fileInputStream.close();
		out.close();
	}


	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

コードの説明:

Code 3〜5行目: ここでは、FileInputStream、IOException、およびPrintをインポートしています。Writer java.io パッケージから。

Code ライン15: guru_download を定義しています サーブレット これは HttpServlet を拡張します。

Code ライン18: href を定義したので、 URLそのため、GET メソッドが処理され (サーブレット内で doGet が呼び出されます)、リクエスト オブジェクトとレスポンス オブジェクトも含まれます。

Code 19〜20行目: レスポンスオブジェクトにコンテンツタイプを設定するとともに、レスポンスからライターオブジェクトも取得しています。

Code 21〜22行目: 変数 gurufile を値 test.txt で定義し、gurupath を c:/guru/upload/ と定義します。

Code 23〜25行目: レスポンスオブジェクトを使用してコンテンツタイプを設定し、setHeaderメソッドを使用して、アップロードされたファイル名をレスポンスオブジェクトのヘッダーに設定します。

Code 27〜28行目: 私たちは、gurupath+gurufileを追加するFileInputStreamを作成します。

Code 31〜33行目: ここでは、 whileループ ファイルが読み込まれるまで実行されるため、条件を != -1 としています。この条件では、printwriter オブジェクトを使用して出力を書き込みます。

上記のコードを実行すると、以下の出力が得られます。

出力:

ファイルをダウンロード中

downloading_1.jspをクリックすると、「Download Here」というハイパーリンクが表示されます。このハイパーリンクをクリックすると、ファイルがシステムにダウンロードされます。

よくあるご質問

はい。AIアシスタントは、ファイルのアップロードとダウンロードのためのサーブレットやJSPフォームを生成し、Apache Commons FileUploadのロジックを追加し、検証方法を提案できます。ただし、コードのテストとファイルパスおよびサイズ制限の確認は必ず行ってください。

はい。AIベースのスキャナーは、アップロードされたファイルがストレージに到達する前に、マルウェア、予期しない種類のファイル、または過大なペイロードを検査できます。これにより保護層が強化されますが、ファイルの種類とサイズのサーバー側での検証は依然として不可欠です。

multipart/form-data エンコーディングはリクエストを複数の部分に分割し、バイナリ ファイル データが transmitがそのままの状態である必要があります。これがないと、ブラウザは実際のファイルの内容ではなく、ファイル名のみをサーバーに送信します。

Apache Commons FileUploadは、Commons IOと連携して広く利用されています。マルチパートリクエストを解析し、各FileItemを公開し、アップロードされたコンテンツをサーバー上の指定されたディレクトリに書き込みます。