파일 업로드에 대한 아파치 오픈 소스 라이브러리를 사용하여 서블릿에서

본 논문에서는 구체적인 예에서, 방법을 설명 서블릿에서 파일 업로드를위한 아파치 오픈 소스 라이브러리가 제공하는 패키지입니다. 이 문서는 참고 도서 "톰캣과 자바 웹 개발 기술 설명,"세 번째 버전, 저자 : Sunweiqin.

본 명세서에서 사용 된 바와 같이, 소프트웨어 버전은 다음과 같습니다 Window10, JDK10, Tomcat9.
웹 사이트의 소스 코드를 다운로드하는 것은 본원으로 언급 된
http://www.javathinker.net/javaweb/upload-app.rar

파일을 아파치 오픈 소스 소프트웨어 조직에 관한 두 개의 패키지를 업로드 :
리터는 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 책은 두 개 이상의 JAR 파일을 제공하고 있습니다. 인터페이스 및 클래스의 서블릿 파일 업로드 패키지의 주요 사용은 파일 업로드 및 I / O 패키지에 따라 파일 업로드 패키지 자체를 구현합니다. 다음.도 1-1 주 인터페이스와 클래스 파일 업로드 패키지의 클래스 다이어그램이다.

파일 업로드에 대한 아파치 오픈 소스 라이브러리를 사용하여 서블릿에서
인터페이스와 클래스도 1-1 파일 업로드 패키지의 주요 클래스의 블록도.

1-2 HTTP 요청 유형을 "multipart / form-data"의 텍스트를, 아래와 같이 요청 부에 포함되는 복합체를 형성 UploadFile로 패키지의 각각의 서브 - 파트는 FileItem 객체로 간주된다. : FileItem 과목은 두 가지 유형으로 분류 하였다
형태로 일반적인 유형의 양식 필드, 텍스트 필드 및 제출 버튼이 유형은 다음과 같습니다 리터의 양식 필드를.
 비 양식 필드 : 업로드 파일 형식, 파일 양식 필드는 파일 데이터를 포함하는이 유형입니다.

파일 업로드에 대한 아파치 오픈 소스 라이브러리를 사용하여 서블릿에서
대상으로도 복합 형태로 각각의 서브 - 부분이다 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); //处理上传文件
  }
}

다음 루틴 1-1에서 UploadServelt 클래스는 Upload.htm으로 사용자의 페이지 파일 업로드 사용 패키지에서 파일 업로드를 처리합니다.

루틴 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");
  }

다음과 같이 UploadServelt은 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>

이 초기화 매개 변수가 UploadServelt은 : 파일 경로 매개 변수는 업로드 된 파일에서 UploadServelt을 저장하기위한 디렉토리를 나타냅니다; tempFilePath 매개 변수 저장을위한 임시 파일의 파일 업로드 패키지의 디렉토리를 나타냅니다.

다음 루틴을 Upload.htm 1-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를 들어,이도 데이터의 형태로 제공하고 양식을 제출하고, UploadServelt은은에 저장이 요청은 "FromClient.rar"와 "FromClient.txt"파일을 응답합니다 helloapp / 저장 디렉토리 및도 클라이언트 HTML 페이지로 돌아갑니다. 1-4.
파일 업로드에 대한 아파치 오픈 소스 라이브러리를 사용하여 서블릿에서
그림 1-4에서 UploadServelt는 HTML 페이지를 반환

(4 ServletFileUpload 객체 setSizeMax 전화 UploadServelt은 1,024 1,024)에있어서, 상기 최대 허용 된 업로드 파일 크기가 4M로 설정된다. 당신은 파일 크기가 그림 1-3에서 4 백만을 Upload.htm 페이지를 초과하는 입력하면, 다음에서 UploadServelt는 업로드 된 파일을 처리하는 예외가 발생합니다 :

org.apache.commons.fileupload.FileUploadBase
$SizeLimitExceededException: 
the request was rejected because its size (7859197) 
exceeds the configured maximum (4194304) 

파일 업로드에 대한 아파치 오픈 소스 라이브러리를 사용하여 서블릿에서

추천

출처blog.51cto.com/sunweiqin/2414513