1. 程式人生 > >Servlet上傳檔案到指定路徑-Form提交

Servlet上傳檔案到指定路徑-Form提交

我們使用開源專案Commons FileUpload最常用ServletFileUpload上傳

專案結構:

pom.xml

這裡就是用到了javax.servlet-api-3.0.1.jar、commons-fileupload-1.3.2.jar、commons-io-2.2.jar

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.citywy</groupId>
  <artifactId>upload-03</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>javax.servlet-api</artifactId>
	    <version>3.0.1</version>
	    <scope>provided</scope>
	</dependency>
	<dependency>
	    <groupId>commons-fileupload</groupId>
	    <artifactId>commons-fileupload</artifactId>
	    <version>1.3.2</version>
	</dependency>
  </dependencies>
  <build>
    <finalName>upload-03</finalName>
  </build>
</project>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"   
    xmlns="http://java.sun.com/xml/ns/javaee"   
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <description></description>
    <display-name>Upload01</display-name>
    <servlet-name>Upload01</servlet-name>
    <servlet-class>com.citywy.servlet.Upload01</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Upload01</servlet-name>
    <url-pattern>/upload01</url-pattern>
  </servlet-mapping>
</web-app>

Upload01.java   

package com.citywy.servlet;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletContext;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

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

    public Upload01() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		//Check that we have a file upload request 檢查是否有檔案上傳請求
		boolean isMultipart=ServletFileUpload.isMultipartContent(request);
		if(isMultipart){
			// Create a factory for disk-based file items 建立DiskFileItemFactory物件,設定緩衝區大小和臨時檔案目錄
			DiskFileItemFactory factory=new DiskFileItemFactory();
			//System.out.println(System.getProperty("java.io.tmpdir"));//預設臨時資料夾
			// Set factory constraints
			/*factory.setSizeThreshold(yourMaxMemorySize);
			factory.setRepository(yourTempDirectory);*/
			
			//Create a new file upload handler建立ServletFileUpload物件,並設定上傳檔案的大小限制
			ServletFileUpload upload=new ServletFileUpload(factory);
			upload.setSizeMax(10 * 1024 * 1024);// 以byte為單位 不能超過10M 1024byte
			
			// Set overall request size constraint
//			upload.setSizeMax(yourMaxRequestSize);
			
			// Parse the request 呼叫ServletFileUpload.parseRequest方法解析request物件,得到一個儲存了所有上傳內容的List物件
			try {
				List<FileItem> items = upload.parseRequest(request);
				// Process the uploaded items
				Iterator<FileItem> iter=items.iterator();
				while(iter.hasNext()){
					FileItem item=iter.next();
					//遍歷list,每迭代一個FileItem物件,呼叫其isFormField方法判斷是否是上傳檔案
					if(item.isFormField()==true){// 普通表單元素
						String name=item.getFieldName();// name屬性值
						String value=item.getString();// name對應的value值
						System.out.println("form field:"+name+"--"+value);
					}else{
						String fieldName = item.getFieldName();
					    String fileName = item.getName();// 檔名稱
					    String contentType = item.getContentType();
					    boolean isInMemory = item.isInMemory();
					    long sizeInBytes = item.getSize();
					    System.out.println("file upload:"+fieldName+"--"+fileName+"--"+contentType+"--"+isInMemory+"--"+sizeInBytes);
					}
					
					// Process a file upload
					if(!item.isFormField()){
						//1.獲取真實地址,這裡儲存在Tomcat執行的專案upload目錄中,這要在src/main/webapp下新建upload資料夾
						/*ServletContext sctx = getServletContext(); 
						String path=sctx.getRealPath("/upload");
						String fileName = item.getName();
						File uploadedFile=new File(path+"\\"+fileName);
						item.write(uploadedFile);*/
						
						//2.儲存到指定碟符
						String fileName=item.getName();
						File uploadedFile=new File("d:/tmp/"+fileName);
						item.write(uploadedFile);
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		}
	}

}

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 
<%
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'upload.jsp' starting page</title> 
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache"> 
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
<meta http-equiv="description" content="This is my page"> 
<!--
<link rel="stylesheet" type="text/css" href="styles.css"> 
-->
</head>
<body>
	<form action="/upload-03/upload01" method="post" enctype="multipart/form-data"> 
		請選擇上傳的圖片或檔案:
		<!-- 這個是item.isFormField()==false -->
		<input type="file" name="fileName"/>
		<!-- 這個走的就是item.isFormField()==true -->
		<input type="text" name="hello" value="taray">
		<input type="submit" value="上傳"/>
	</form>
</body>
</html>