1. ホーム
  2. Web プログラミング
  3. JSP プログラミング

ファイルアップロード機能のJSP実装

2022-01-03 11:14:59

この例では、参考のため、ファイルアップロード機能のJSP実装の具体的なコードを、以下のように共有します。

I. 準備

io.jarパッケージと一緒にfileupload.jarが必要です。完了パスの構築後、続行可能です。

リソースアドレス

次に、ページセクション

<form action="UploadServlet" method="post" enctype="multipart/form-data">
 Academic number:<input type="text" name="sno"/><br/>
 Name:<input type="text" name="sname"/><br/>
 Upload a photo:<input type="file" name="spicture"/><br/>
 <input type="submit" value="register"/>
</form>

注意事項

1. ファイルアップロードは、getメソッドを使用する際に検索ボックスが運べる以上の文字数を転送しないよう、postを使用する必要があります。

2. enctype="multipart.form-data" フィールドを追加する必要があります。

3. "file"は、fileのところで必要です。

III. サーブレット部分

package webtest;
 
import java.io.File;
import java.io.IOException;
import java.util;
import java.util.List;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http;
 
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
 
ServletFileUpload; /**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  request.setCharacterEncoding("utf-8");// request encoding processing, when transferring
  response.setCharacterEncoding("utf-8");// response encoding, when transferring
  response.setContentType("utf-8");// response encoding, when displaying
  boolean isMultipart = ServletFileUpload.isMultipartContent(request);// determine whether there is entype="multipart/form-data" part
  if (isMultipart) {
   try {
    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    
    // set the size of the memory buffer when uploading, and write a temporary file if it exceeds 10kb
    ((DiskFileItemFactory) factory).setSizeThreshold(10240);//unit byte
    //set the temporary file directory to prevent the system from running out of space
    ((DiskFileItemFactory) factory).setRepository(new File(request.getSession().getServletContext().getRealPath("Uploadtemp")) );// dynamically get the location of the Uploadtemp folder in the project
    //control the maximum size of a single file upload 20kb
    upload.setSizeMax(20480);//unit byte
    
    List<FileItem> items = upload.parseRequest(request);// parse all request fields in the form and save them in the items
    Iterator<FileItem> iter = items.iterator();
 
    while (iter.hasNext()) {
     // Parsing is not sequential, so you need to look by name
     FileItem item = iter.next();
     if (item.isFormField()) { // non-file data
      String itemName = item.getFieldName();//Get the name of the non-file range data
      if (itemName.equals("sno")) {
       int sno = -1;
       sno = Integer.parseInt(item.getString("utf-8"));
      }
      else if (itemName.equals("sname")) {
       String sname = null; 
       sname = item.getString("utf-8");
 
      } 
      else {
       System.out.println("Other fields... ");
      }
 
     } else {//File upload
      String fileName = item.getName();//Get the file range data. Path and its name
      //judge the file type
      String ext = fileName.substring(fileName.indexOf(". ") + 1);
      if(! (ext.equals("png")||ext.equals("gif")||ext.equals("jpg"))) {
       System.out.println("Only png.gif,jpg type files are supported");
       return ;
      }
      String path = request.getSession().getServletContext().getRealPath("Upload");// dynamically get the location of the Upload folder in the project
      File file = new File(path,fileName);
      item.write(file);//define the upload path, mostly the server path
      System.out.println(fileName+"Upload successful");
     }
     item.delete();//delete the files in the temporary directory
    }
   } 
   catch(FileUploadBase.SizeLimitExceededException e) {
    System.out.println("Maximum 20KB");
   }
   catch (FileUploadException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } 
   catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 
 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
  * response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  // TODO Auto-generated method stub
  doGet(request, response);
 }
 
}

注意事項

1. 場所が赤くマークされ、マウスを置いた後にパッケージが見つからない場合、"alt"+"/"のキーの組み合わせを使って、インポートする下の最初のクラスを選択することができます。

2. UploadとUploadtempのファイルがtomcatの対応するプロジェクトの下に格納されている場合、eclipseを通してコードを更新するたびに、eclipse下のコードが直接上書きされるため、2つのフォルダが直接上書きされることになります。eclipseで設定するか、他のフォルダの絶対パス/相対パスで設定してください。

3. 一時ファイルのデータは短時間しか保持されないので、プログラムをハイバネートさせるためにスリープを追加すると、それが見えてしまうかもしれません。item.delete()を使わなくても、セッション全体が終了した後にテンポラリファイルは削除されます。

4. ファイルが見つからないというエラーが報告された場合、Eclipseに付属しているブラウザではなく、Googleの場合はブラウザを使ってやってみてください。

今回は以上です。皆様の学習のお役に立てれば幸いです。そして、スクリプトハウスを応援していただければ幸いです。