servlet文件上傳2——復合表單提交(數據獲取和文件上傳)
阿新 • • 發佈:2017-08-14
import bmi util 3.2 utf false ons quest pat
UnsupportedEncodingException異常,英語也不好,百度單詞的意思吧,什麽不支持的編碼異常,到此終於發現這個是設置編碼的方法;
所以呢,寫方法;寫類;寫變量;寫參數時,能讓人見文知意是多麽重要;要是這個方法直接這樣寫的getString(String charset)一看就知道是設置編碼格式的方法了把。
上傳文件時表單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)方法會拋一個
添加商品的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——復合表單提交(數據獲取和文件上傳)