1. 程式人生 > >javaweb實現圖片檔案上傳

javaweb實現圖片檔案上傳

圖片上傳到檔案中,可以直接上傳圖片到目錄中,也還可以將圖片檔名、檔案路徑寫入到資料庫中,也可以在程式中動態的建立檔案路徑。

參看:http://blog.csdn.net/lmdcszh/article/details/9201173

package com.ioif.wha.imageUpload;

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

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

public class FileUploadServlet extends HttpServlet {
	
	private File uploadPath;
	
	private File tempPath;
	
	public void init() throws ServletException {
		// 在系統啟動的時候,就開始初始化,檢查上傳圖片的資料夾和存放臨時檔案的資料夾是否存在,如果不存在,就建立
		//獲取根目錄對應的真實物理路徑
		uploadPath = new File(getServletContext().getRealPath("upload"));
		System.out.println("uploadPath======="+uploadPath);
		//如果目錄不存在
		if(!uploadPath.exists()){
			//建立目錄
			uploadPath.mkdir();
		}
		
		//臨時目錄
//		File tempFile = new File(item.getName())構造臨時物件
		tempPath = new File(getServletContext().getRealPath("temp"));
		System.out.println("tempPath======="+tempPath);
		if(!tempPath.exists()){
			tempPath.mkdir();
		}
		
		//如果不顯示呼叫父類方法,就不會有itemManager例項,因此會造成空指標
		super.init();
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("---doPost--");
		//從item_upload.jsp中拿取資料,因為上傳頁的編碼格式跟一般的不同,使用的是enctype="multipart/form-data"  
//        form提交採用multipart/form-data,無法採用req.getParameter()取得資料  
//        String itemNo = req.getParameter("itemNo");  
//        System.out.println("itemNo======" + itemNo);  
		 /********************************使用 FileUpload 元件解析表單********************/  
		//DiskFileItemFactory:建立FileItem 物件的工廠,在這個工廠類中可以配置記憶體緩衝區大小和存放臨時檔案的目錄
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//設定是否將上傳檔案已臨時檔案的形式儲存在磁碟的臨界值(以位元組為單位的int值),如果從沒有呼叫該方法設定此臨界值,將會採用系統預設值10KB。對應的getSizeThreshold() 方法用來獲取此臨界值
		factory.setSizeThreshold(4096);//4kb
		//設定當上傳檔案尺寸大於setSizeThreshold方法設定的臨界值時,將檔案以臨時檔案形式儲存在磁碟上的存放目錄。有一個對應的獲得臨時資料夾的 File getRespository() 方法 
		factory.setRepository(tempPath);
	    //ServletFileUpload:負責處理上傳的檔案資料,並將每部分的資料封裝成一到 FileItem 物件中。  
        //在接收上傳檔案資料時,會將內容儲存到記憶體快取區中,如果檔案內容超過了 DiskFileItemFactory 指定的緩衝區的大小,  
        //那麼檔案將被儲存到磁碟上,儲存為 DiskFileItemFactory 指定目錄中的臨時檔案。  
        //等檔案資料都接收完畢後,ServletUpload再從檔案中將資料寫入到上傳檔案目錄下的檔案中  
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setSizeMax(1000000 * 20);
		 /*******************************解析表單傳遞過來的資料,返回List集合資料-型別:FileItem***********/  
		
		try{
			List<FileItem> fileItems = upload.parseRequest(request);
			String itemNo = "";
			//Iterator iter = fileItems.iterator()取其迭代器
			//iter.hasNext()檢查序列中是否還有元素
			System.out.println("---fileItems--"+fileItems.size());
			for (Iterator iter = fileItems.iterator();iter.hasNext(); ) {
				//獲取序列中的下一個元素
				FileItem item = (FileItem) iter.next();
				System.out.println("---5555--");
				//判斷是檔案還是文字資訊
				//是普通的表單輸入域
				if(item.isFormField()){
					if("itemNo".equalsIgnoreCase(item.getFieldName())){
						itemNo = item.getString();
						System.out.println("itemNo======="+itemNo);
					}
				}
				//是否為input="type"輸入域
				if(!item.isFormField()){
					//上傳檔案的名稱和完整路徑
					String fileName = item.getName();
					long size = item.getSize();
					//判斷是否選擇了檔案
					if(fileName == null || fileName.equals("") && size == 0){
						continue;
					}
					//擷取字串 如:C:\WINDOWS\Debug\PASSWD.LOG  
					fileName = fileName.substring(fileName.lastIndexOf("\\")+1,fileName.length());
					System.out.println("fileName======="+fileName);
					// 儲存檔案在伺服器的物理磁碟中:第一個引數是:完整路徑(不包括檔名)第二個引數是:檔名稱    
                    //item.write(file); 
                    //修改檔名和物料名一致,且強行修改了副檔名為gif 
                    //item.write(new File(uploadPath, itemNo + ".gif")); 
                    //將檔案儲存到目錄下,不修改檔名 
                    item.write(new File(uploadPath, fileName)); 
                    
              
				}
			}

		}catch(Exception e){
			e.printStackTrace();
//			throw new ApplicationException("上傳失敗", null);
		}
	}



}

注:

解析表單傳遞過來的資料,通過upload.parseRequest(request)返回List集合資料-型別:FileItem,測試時,request正常提交了表單,但還是出現parseRequest(request)為空,list.size()為0的情況,問題可能出在web.xml檔案上,和filter有關,配置struts那裡

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

這樣所有的檔案都會被struts攔截,顯然這是不恰當的,我就改成了下面這樣。

    <url-pattern>*.do,*.action</url-pattern>


然後上傳功能就又恢復正常了

參看:http://blog.csdn.net/en_reading/article/details/52486804