本論文では、具体的な例では、パッケージは、サーブレットでファイルアップロードのためのApacheのオープンソースライブラリで提供する方法について説明します。この記事は参考書「TomcatとJavaのWeb開発技術を説明し、」第三版、著者である:Sunweiqin。
本明細書で使用する場合、ソフトウェアのバージョンがある:Window10、JDK10、Tomcat9。
ここで言及ウェブサイトのソースコードをダウンロードして:
http://www.javathinker.net/javaweb/upload-app.rar
ファイルとApacheのオープン・ソース・ソフトウェア・団体がに関連する2つのパッケージがアップロード:
リットルのFileUploadパッケージ(コモンズ-ファイルアップロード-X.jar):パッケージファイルのアップロード、ダウンロードサイトで:http://commons.apache.org /のFileUpload /。
パッケージ記述文書のURLを使用することです:http://commons.apache.org/fileupload/using.html。
I / Oパッケージ(コモンズ-IO-X.jar):パッケージには、入力と出力、のダウンロードサイトを担当してhttp://commons.apache.org/io/。
JARファイルには、helloapp / WEB-INF / libディレクトリ下に置かれた二つのパッケージを置く必要があります。ソースコードパッケージ/ WEB-INF / libディレクトリをサポートしているソースコード/ chapter05 / helloappブックは以上の2つのJARファイルを提供してきました。サーブレットファイルアップロードファイルアップロードを実装するためのインタフェースとクラスのパッケージ、およびI / Oパッケージに依存してファイルアップロードパッケージ自体の主な用途。以下は、図1-1のプライマリインターフェースとクラスファイルアップロードパッケージのクラス図です。
インタフェースおよびクラス図の1-1ファイルアップロードパッケージの主要なクラスのブロック図。
1-2 HTTP要求タイプの「マルチパート/フォームデータ」のテキストを、以下に示す、要求部分に含まれている複合体を形成UploadFileパッケージの各サブ部分がFileItemオブジェクトとしてみなされます。:FileItem被験者は二つのタイプに分けられた
このタイプのものであり、通常タイプのフォームフィールド、フォームのテキストフィールドとボタンを提出:リットルFORMFIELD。
非FORMFIELD:アップロードファイルの種類は、ファイルのフォームフィールドには、ファイルのデータが含まれているこのタイプです。
図複合形態における各サブ部分1-2オブジェクトはFileItemそのまま
FileItemFactoryはFileItemオブジェクトファクトリを作成されます。DiskFileItemFactoryクラスとクラスがDiskFileItem FileItemFactory FileItemインターフェースとインターフェースを実現しました。DiskFileItemクラスはFileItemベースのハードドライブを表し、DiskFileItemクラスは、ハードディスクにデータファイルをアップロードするには、クライアントを保存することができます。DiskFileItemFactoryはDiskFileItemオブジェクトファクトリを作成されます。
次のプログラムコードはDiskFileItemFactoryオブジェクトを作成し、使用するバッファのハード・ディスク・サイズ、ならびに使用される一時ディレクトリへの書き込みデータを設定します。ファイルアップロード独自のパッケージの実装では、特に効率的に大量のデータを書き込み、ハードディスクへのデータ書き込みの効率を改善するために、ファイルアップロードパッケージは、キャッシュ内のデータを書き込むことができ、かつ、一時ディレクトリへのデータの一時記憶。
//创建一个基于硬盘的FileItem工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置向硬盘写数据时所用的缓冲区的大小,此处为4K
factory.setSizeThreshold(4*1024);
//设置临时目录
factory.setRepository(new File(tempFilePath));
FileItemFactoryに関連付けられているServletFileUploadクラスファイルのアップロードプロセッサ。次のコードは、DiskFileItemFactoryオブジェクトに関連付けられているプログラムServletFileUploadオブジェクトを作成します。setSizeMax ServletFileUploadクラス()メソッドは、アップロードされたファイルの最大許容サイズを設定するために使用されています。
//创建一个文件上传处理器
ServletFileUpload upload = new ServletFileUpload(factory);
//设置允许上传的文件的最大尺寸,此处为4M
upload.setSizeMax(4*1024*1024);
ServletFileUploadクラスparseRequest(HttpServletRequestのREQ)メソッドは、複合フォームデータHttpServletRequestオブジェクトを解決することができ、オブジェクトはリスト収集FileItemのセットが含まれて返します。
List<FileItem> items = upload.parseRequest(request);
このセットを通過できるFileItemリストオブジェクトを含むセットを得た後、それは各オブジェクトFileItemのタイプを決定し、適切な処置を行います。
for(FileItem item:items){ //遍历集合中的每个FileItem对象
if(item.isFormField()) {
processFormField(item,out); //处理普通的表单域
}else{
processUploadedFile(item,out); //处理上传文件
}
}
upload.htmユーザーページファイルアップロード用パッケージ内のファイルのアップロードを処理するには、次のルーチン1-1 UploadServletクラス。
ルーチン1-1 UploadServlet.java
package mypack;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.servlet.*;
import org.apache.commons.fileupload.disk.*;
public class UploadServlet extends HttpServlet {
private String filePath; //存放上传文件的目录
private String tempFilePath; //存放临时文件的目录
public void init(ServletConfig config)throws ServletException {
super.init(config);
filePath=config.getInitParameter("filePath");
tempFilePath=config.getInitParameter("tempFilePath");
filePath=getServletContext().getRealPath(filePath);
tempFilePath=getServletContext().getRealPath(tempFilePath);
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
//向客户端发送响应正文
PrintWriter out=response.getWriter();
try{
//创建一个基于硬盘的FileItem工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置向硬盘写数据时所用的缓冲区的大小,此处为4K
factory.setSizeThreshold(4*1024);
//设置临时目录
factory.setRepository(new File(tempFilePath));
//创建一个文件上传处理器
ServletFileUpload upload = new ServletFileUpload(factory);
//设置允许上传的文件的最大尺寸,此处为4M
upload.setSizeMax(4*1024*1024);
List<FileItem> items = upload.parseRequest(request);
for(FileItem item:items){
if(item.isFormField()) {
processFormField(item,out); //处理普通的表单域
}else{
processUploadedFile(item,out); //处理上传文件
}
}
out.close();
}catch(Exception e){
throw new ServletException(e);
}
}
private void processFormField(FileItem item,PrintWriter out){
String name = item.getFieldName();
String value = item.getString();
out.println(name+":"+value+"\r\n");
}
private void processUploadedFile(FileItem item,
PrintWriter out)throws Exception{
String filename=item.getName();
int index=filename.lastIndexOf("\\");
filename=filename.substring(index+1,filename.length());
long fileSize=item.getSize();
if(filename.equals("") && fileSize==0)return;
File uploadedFile = new File(filePath+"/"+filename);
item.write(uploadedFile);
out.println(filename+" is saved.");
out.println("The size of " +filename+" is "+fileSize+"\r\n");
}
UploadServlet web.xmlファイルの構成コードは次のとおりです。
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>mypack.UploadServlet</servlet-class>
<init-param>
<param-name>filePath</param-name>
<param-value>store</param-value>
</init-param>
<init-param>
<param-name>tempFilePath</param-name>
<param-value>temp</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>upload</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
2つの初期化パラメータがありますUploadServlet:FilePathパラメーターは、アップロードされたファイルUploadServletを格納するディレクトリを表し; tempFilePathパラメータは、ストレージのための一時ファイルのファイルアップロードパッケージのためのディレクトリを表します。
次のルーチンupload.htm 1-2は、ファイルをアップロードするための複合型を定義し、それは「ユーザ名」テキストフィールドの名前を持つ、ファイルをアップロードするファイルを指定するための2つのフィールドがあります。
ルーチン1-2 upload.htm
<html>
<head>
<title>Upload</title>
</head>
<body >
<form name="uploadForm" method="POST"
enctype="MULTIPART/FORM-DATA"
action="upload">
<table>
<tr>
<td><div align="right">User Name:</div></td>
<td><input type="text" name="username" size="30"/> </td>
</tr>
<tr>
<td><div align="right">Upload File1:</div></td>
<td><input type="file" name="file1" size="30"/> </td>
</tr>
<tr>
<td><div align="right">Upload File2:</div></td>
<td><input type="file" name="file2" size="30"/> </td>
</tr>
<tr>
<td><input type="submit" name="submit" value="upload"></td>
<td><input type="reset" name="reset" value="reset"></td>
</tr>
</table>
</form>
</body>
</ HTML>
ブラウザからのHTTPへ:// localhostを:8080 / helloapp / upload.htm、HTML 図1-3に示すページが表示されます。
図1-3 upload.htmページ
upload.htm図ページ1-3の場合は、そこに図1に示すデータの形で提供してフォームを送信している、UploadServletは、この要求を対応させていただきます「FromClient.rar」と「FromClient.txt」ファイルがに保存されますhelloapp /ストアディレクトリの下に、図1-4に示したクライアントのHTMLページに戻ります。
図1-4 UploadServletは、HTMLページを返さ
(4 ServletFileUploadオブジェクトsetSizeMaxを呼び出すUploadServlet 1024 1024)の方法、最大許容ファイルアップロードサイズは4Mに設定されています。あなたはファイルサイズが図1-3中の4Mのupload.htmページを超えて入力した場合は、次のUploadServletは、アップロードされたファイルを処理の例外がスローされます。
org.apache.commons.fileupload.FileUploadBase
$SizeLimitExceededException:
the request was rejected because its size (7859197)
exceeds the configured maximum (4194304)