1. 程式人生 > >Java Web 學習筆記之一:伺服器獲取表單上傳的檔案

Java Web 學習筆記之一:伺服器獲取表單上傳的檔案

Servlet3.0標準之後,Java Web檔案上傳就不需要通過FileUpload等庫來實現了,通過servlet API即可實現web後臺的檔案上傳支援。

表單提交請求,表單中的檔案可以通過request.getPart()方法獲取。

下面來介紹獲取檔案的具體使用方法:

(1)在servlet類上新增AMultipartConfig註解

(2)通過HttpServletRequestgetPart()方法或getParts()方法獲取Part物件

(3)通過操作Part物件對獲取的檔案進行操作

注意:

新增@MultipartConfig註解之後,entype=”multipart/form-data”的表單型別也可以通過request.getParameter()

方法來獲取和檔案一起提交的普通字串引數。如果沒有@MultipartConfig註解,getParameter()方法只能處理enctype=”application/x-www-form-urlencoded”的表單型別。

放上例程以及註釋:

1.servlet例程,getpart方法在doPost方法中使用

package com.johnson.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import com.johnson.tools.UploadUtil;


/**
 * created by johnson on 2016/5/11
 * @author johnson
 * @version 1.0
 * @description 嘗試檔案上傳功能的servlet,需要通過jsp/html或者移動裝置的表單格式傳送post請求
 * @attention 通過getpart獲取檔案的方法需要servlet3.0以上支援
 * @attention 新增@MultipartConfig註解之後,multipart/form-data型別的表單也可以通過request的getparameter方法獲取資料
 * */

@MultipartConfig
public class FileUploadTestServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	public String baseFileSavePath = null;//檔案儲存的基礎路徑(自定義)

	/**
	 * method init
	 * @throws ServletException 
	 * */
	public void init(ServletConfig config) 
			throws ServletException{
		super.init(config);
		this.baseFileSavePath = this.getServletContext().getInitParameter("BaseFilePath");//從web.xml排位置檔案中獲取基礎路徑
	}

	/*
	 * @method doPost
	 * @description 在doPost方法中使用getPart方法獲取請求上傳的檔案
	 * */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException{
		request.getSession();
		try{
			Part part0 = request.getPart("file0");//獲取名稱為file0的檔案
			part0.write(this.baseFileSavePath+UploadUtil.getFileName(part0));//用Part的write方法將檔案寫入磁碟中
		}catch(IOException e){
			e.printStackTrace();
		}
		try{
			Part part1 = request.getPart("file1");//獲取名稱為file1的檔案
			part1.write(this.baseFileSavePath+UploadUtil.getFileName(part1));//用Part的write方法將檔案寫入磁碟中
		}catch(IOException e){
			e.printStackTrace();
		}
		response.getWriter().write("OK!");
		
	}
	

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException{
		doPost(request, response);
	}
	
}

2.另外一個類用來從獲取的Part物件中獲取相應的檔案屬性等

package com.johnson.tools;

/** 
 * 此工具類只適用於Servlet 3.0 
 */  
import javax.servlet.http.*;  
public class UploadUtil{  
		
		//獲取檔案型別返回一個類似於".XXX"的字串
       	public static String getFileType(Part p){  
       		String name = p.getHeader("content-disposition");  
       		String fileNameTmp = name.substring(name.indexOf("filename=")+10);//擷取字串獲取檔名
       		String type = fileNameTmp.substring(fileNameTmp.indexOf(".")+1,fileNameTmp.indexOf("\""));//擷取檔名獲取檔案字尾名(型別)
       		return type;  
       	}  
       	
       	//獲取檔名返回一個類似於"XXX.XXX"的完整檔名,包括了字尾
       	public static String getFileName(Part p){  
       		String name = p.getHeader("content-disposition");  
       		String fileNameTmp = name.substring(name.indexOf("filename=")+10);  
       		String fileName = fileNameTmp.substring(0,fileNameTmp.indexOf("\""));  
       		return fileName;  
       	}  
}