程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 利用apache的FileUpload組件實現文件上傳

利用apache的FileUpload組件實現文件上傳

編輯:關於JAVA

1、可以實現一個或多個文件的上傳,也可以接收普通的form表單數據。

2、簡單測試了一下,對內存的占用還是可以忍受的,而且速度也可以。偶爾會導致內存使用的上升而且不會下降,長時間後是否會降下來還沒有測試。

關鍵點:

1、提交文件上傳的form的method屬性為post,enctype屬性為multipart/form-data。

2、input標簽需要有name屬性,否則取不到內容。

看看servlet的實現,注釋已經很詳細了:

Java代碼

package org.xxm;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dareway.org.apache.commons.fileupload.FileItem;
import dareway.org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import dareway.org.apache.commons.fileupload.disk.DiskFileItemFactory;
import dareway.org.apache.commons.fileupload.servlet.ServletFileUpload;
import dareway.org.apache.commons.fileupload.util.Streams;

/**
 * @author xuxiaoming
 * 2009-03-19
 * 以tomcat6.0為服務器
 */
public class UploadFileServlet extends HttpServlet {
	public void doGet(HttpServletRequest req,
			HttpServletResponse res) {
		return;
	}
	
	public void doPost(HttpServletRequest req,
			HttpServletResponse res) throws IOException {
		/**
		 * form中的enctype必須是multipart/...
		 * 組件提供方法檢測form表單的enctype屬性
		 * 在isMultipartContent方法中同時檢測了是否是post提交
		 * 如果不是post提交則返回false
		 */
		if(ServletFileUpload.isMultipartContent(req)) {
			req.setCharacterEncoding("utf-8");
			DiskFileItemFactory factory = new DiskFileItemFactory();
			/**
			 * 臨時文件存儲路徑要真實存在
			 */
			factory.setRepository(new File("../webapps/fileupload/tmp"));
			//內存最大占用
			factory.setSizeThreshold(1024000);
			ServletFileUpload sfu = new ServletFileUpload(factory);
			//單個文件最大值byte
			sfu.setFileSizeMax(102400000);
			//所有上傳文件的總和最大值byte
			sfu.setSizeMax(204800000);
			List items = null;
			try {
				items = sfu.parseRequest(req);
			} catch (SizeLimitExceededException e) {
				System.out.println("size limit exception!");
			} catch(Exception e) {
				e.printStackTrace();
			}
			
			Iterator iter = items==null?null:items.iterator();
			while(iter != null && iter.hasNext()) {
				FileItem item = (FileItem)iter.next();
				//簡單的表單域
				if(item.isFormField()) {
					System.out.print("form field:");
					System.out.print(item.getFieldName() + "  ");
					System.out.print(item.getString());
				} 
				//文件域
				else if(!item.isFormField()) {
					System.out.println("client name:" + item.getName());
					String fileName = item.getName().substring(item.getName().lastIndexOf("\\"));
					BufferedInputStream in = new BufferedInputStream(item.getInputStream());
					//文件存儲在工程的upload目錄下,這個目錄也得存在
					BufferedOutputStream out = new BufferedOutputStream(
							new FileOutputStream(new File("../webapps/fileupload/upload/" + fileName)));
					Streams.copy(in, out, true);
				}
			}
		} else {
			System.out.println("enctype error!");
		}
	}
}

因為使用tomcat做得服務器,所以裡面的路徑都是以tomcat為基礎來寫得,具體情況需要修改。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved