1. 程式人生 > >servlet文件上傳2——復合表單提交(數據獲取和文件上傳)

servlet文件上傳2——復合表單提交(數據獲取和文件上傳)

import bmi util 3.2 utf false ons quest pat

上傳文件時表單enctype屬性必須要更改為<enctype=‘multipart/form-data‘>;采用post提交表單,元素需要有name屬性;

利用第三方jar包(commons-fileupload-1.2.1.jar commons-io-1.3.2.jar )進行普通數據獲取和文件上傳;普通文本需要用getString("編碼格式")方法獲取,否則漢字會出現亂碼,最開始我一直用的getString()獲取,發現傳到數據的數據全是亂碼,查看流浪器的裏面的請求和響應全是正常的,百度了半天也沒找到真正的解決方法,無意間發現第三方包裏面的FileItem還有一個重載的getString(String args)方法,但是不曉得參數傳什麽;後來發現這個getString(String args)方法會拋一個

UnsupportedEncodingException異常,英語也不好,百度單詞的意思吧,什麽不支持的編碼異常,到此終於發現這個是設置編碼的方法; 所以呢,寫方法;寫類;寫變量;寫參數時,能讓人見文知意是多麽重要;要是這個方法直接這樣寫的getString(String charset)一看就知道是設置編碼格式的方法了把。

添加商品的Servlet:

package ni.jun.yang.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import ni.jun.yang.service.KindService;


@WebServlet("/AddGoodsServlet")
public class AddGoodsServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;       
    
    public AddGoodsServlet() {      
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//響應編碼格式
		response.setCharacterEncoding("utf-8");		
		PrintWriter out = response.getWriter();
		//遍歷類型的集合,得到下拉框選項
		List<String> list = new ArrayList<>();
		String sql = "Select * from kind";
		list = new KindService().select(sql);
		out.println("<html><head><meta charset=‘utf-8‘><title>添加商品</title>");
		out.println("</head>");
		out.println("<body>");
		//上傳文件的提交方式
		out.println("<form action=‘AddResultServlet‘ method=‘post‘ enctype=‘multipart/form-data‘>");
		out.println("<table>");
		
		out.println("<tr>");
		out.println("<td>名稱:</td>");
		out.println("<td><input type=‘text‘ name=‘mingzi‘></td>");
		out.println("</tr>");
		
		out.println("<tr>");
		out.println("<td></td>");
		out.println("<td><input type=‘file‘ name=‘filename‘></td>");
		out.println("</tr>");
		
		out.println("<tr>");
		out.println("<td>介紹:</td>");
		out.println("<td><input type=‘text‘ name=‘jieshao‘></td>");
		out.println("</tr>");
		
		out.println("<tr>");
		out.println("<td>售價:</td>");
		out.println("<td><input type=‘text‘ name=‘shoujia‘></td>");
		out.println("</tr>");
		
		out.println("<tr>");
		out.println("<td>分類:</td>");
		out.println("<td>");
		out.println("<select name=‘fenlei‘>");
		//遍歷類型的集合,得到下拉框選項
		for (int i = 0;i<list.size();i++) {
			out.println("<option value="+(i+1)+">");
			out.println(list.get(i));
			out.println("</option>");
		}
		out.println("</select>");
		out.println("</td>");
		out.println("</tr>");
		
		out.println("<tr>");
		out.println("<td> </td>");
		out.println("<td><input type=‘submit‘ value=‘添加‘></td>");
		out.println("</tr>");
		out.println("</table>");
		out.println("</form>");
		out.println("</body>");
		out.println("</html>");
		
	}	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		
		doGet(request, response);
	}
}

  處理提交數據的Servlet:

package ni.jun.yang.servlet;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;

import ni.jun.yang.bean.Goods;
import ni.jun.yang.service.GoodsService;


@WebServlet("/AddResultServlet")
public class AddResultServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public AddResultServlet() {
        
    }	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");

		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setSizeThreshold(1024*1024*5);
		ServletFileUpload upload = new ServletFileUpload(factory);
		List<FileItem> fileItems = null;
		Goods goods = new Goods();
		try {
			//請求數據返回FileItem類型的數組
			 fileItems = upload.parseRequest(request);
		} catch (FileUploadException e) {
			
			e.printStackTrace();
		}
		//上傳的文件存放路徑
		String path = getServletContext().getRealPath("/image");
		File f = new File(path);
		//沒有此路徑就創建
		if(!f.exists()){
			f.mkdirs();
        }
		//遍歷請求數據的集合進行數據的獲取和文件的上傳
		for (FileItem x : fileItems) {
        	try {
				uploading(x, goods, path);
			} catch (Exception e) {
				
				e.printStackTrace();
			}
        }
		//普通數據存入數據庫,頁面跳轉
		if(new GoodsService().add(goods)){
			request.getRequestDispatcher("success.html").forward(request, response);
		}else{
			response.sendRedirect("lose.html");
		}
		
	}
	/**
	 * 數據的獲取和文件上傳
	 * @param fileItem   
	 * @param goods			待添加的商品
	 * @param path			上傳的路徑
	 * @throws Exception
	 */
	private void uploading (FileItem fileItem,Goods goods,String path) throws Exception{
		//普通文本數據    
		//只能獲取字符串,其他的數據需要通過包裝類的方法轉化得到
		if(fileItem.isFormField()){
			if(fileItem.getFieldName().equals("mingzi")){
				//獲取普通的文本數據利用getString("utf-8"),設置編碼格式。否則會出現漢字亂碼
				goods.setName(fileItem.getString("utf-8"));
				
			}else if(fileItem.getFieldName().equals("jieshao")){
				goods.setExplain(fileItem.getString("utf-8"));

			}else if(fileItem.getFieldName().equals("shoujia")){
				//字符串轉Double
				goods.setPrice(Double.parseDouble(fileItem.getString()));

			}else if(fileItem.getFieldName().equals("fenlei")){
				String type = fileItem.getString();
				goods.setType(Integer.parseInt(type));

			}
		}else{
			// 文件類型
			String fileName = fileItem.getName();
//			System.out.println(fileName);
			//設置上傳的文件名字,利用時間返回毫秒數,保證上傳的文件不重名
			String path1 = new Date().getTime()+"_"+fileName;
			String fileName2= path+"\\"+ path1;
			File file = new File(fileName2);
			//數據只存放文件名字
			goods.setPhoto(path1);
//			System.out.println(fileName2);
			try {
				fileItem.write(file);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		doGet(request, response);
	}

}

  效果圖:

技術分享

技術分享

完整項目網盤地址:http://pan.baidu.com/s/1boWm05T 密碼:blqh

servlet文件上傳2——復合表單提交(數據獲取和文件上傳)