最近在學習java web,在練習DVD信息管理系統時一直對照片上傳問題的處理感到非常棘手,在我的仔細研究和鑽研下,終於完美解決了這個難題,下面我講述一下具體的步驟:
思路闡述:將圖片放到項目的/webTest/imgs/文件夾下,為了避免圖片名重復,將圖片名改為獲取當前秒數+ .jpg的格式。然后將圖片的項目路徑儲存到數據庫中,以便后面展示圖片進行讀取圖片信息。
第一步:准備工作
環境要求
1. 開發環境: Eclipse
2.導入兩個文件上傳的jar包
3 MySQL平台,我用的是dbForge Studio for MySQL。
第二步 創建一個PhotoDao類來處理前台file Input上傳的圖片資源
/** * @author Mr Tang * @version Create Time:2018年10月24日 下午8:22:22 * com.tang.dao * */ package com.tang.dao; import java.io.File; import java.util.Date; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; 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; /** * @author Mr Tang * */ public class PhotoDao { /** *2018年10月24日下午10:41:33 *這個函數的功能是獲取前端的數據集合,將文件打包成File以便后續操作 */ public static List<FileItem> getRequsetFileItems(HttpServletRequest request,ServletContext servletContext){ boolean isMultipart=ServletFileUpload.isMultipartContent(request); if(isMultipart) { DiskFileItemFactory factory = new DiskFileItemFactory(); String str="javax.servelet.context.tempdir"; File repository=(File) servletContext.getAttribute(str); factory.setRepository(repository); ServletFileUpload upload=new ServletFileUpload(factory); try { return upload.parseRequest(request); }catch (FileUploadException e) { // TODO: handle exception return null; } }else { return null; } } /** *2018年10月24日下午10:37:59 *這個函數的功能是將文件傳到預先設置的絕對路徑中,也就是項目里的imgs文件夾 */ public static boolean saveFile(FileItem item,String fileName) { File savePath=new File("E:\\Users\\javawebspace\\dvdWeb3.5\\WebContent\\imgs"); if(!savePath.exists()) { savePath.mkdirs(); } File uploadFile=new File(savePath+File.separator+fileName); try{ item.write(uploadFile); System.out.println("保存文件成功"); return true; }catch(Exception e){ System.out.println("保存文件失敗"); } return false; } /** *2018年10月24日下午8:02:04 *這個函數的功能是獲取當前時間點與1970年的間隔秒數 */ public static int getSecondTimestamp(Date date){ if (null == date) { return 0; } String timestamp = String.valueOf(date.getTime()); System.out.println(timestamp); int length = timestamp.length(); if (length > 3) { return Integer.valueOf(timestamp.substring(0,length-3)); } else { return 0; } } /** * *2018年10月24日下午8:42:05 *這個函數的功能是得到新的照片名稱 */ public static String getPhotoNewName() { Date date=new Date(); int second=getSecondTimestamp(date); String fileName=String.valueOf(second)+".jpg"; return fileName; } /** *2018年10月24日下午8:48:58 *這個函數的功能是判斷文件后綴是否是jpg格式 */ public static boolean isGif(FileItem item) { String fileFullName=item.getName(); File fileInfo=new File(fileFullName); String suffix = fileInfo.getName().substring(fileInfo.getName().lastIndexOf(".") + 1); if(suffix.equals("jpg")) { return true; } return false; } }
第三步 創建一個接收圖片的jsp前端頁面
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() 6 + path + "/"; 7 %> 8 <!DOCTYPE html> 9 <html> 10 <head> 11 <meta charset="UTF-8"> 12 <title>添加DVD信息</title> 13 </head> 14 <style type="text/css"> 15 table.gridtable { 16 font-family: verdana, arial, sans-serif; 17 font-size: 15px; 18 color: #333333; 19 border-width: 1px; 20 border-color: #666666; 21 border-collapse: collapse; 22 } 23 24 table.gridtable th { 25 border-width: 1px; 26 padding: 8px; 27 border-style: solid; 28 border-color: #666666; 29 background-color: #dedede; 30 } 31 32 table.gridtable td { 33 border-width: 1px; 34 padding: 8px; 35 border-style: solid; 36 border-color: #666666; 37 background-color: #ffffff; 38 } 39 </style> 40 <script type="text/javascript"> 41 //檢查登錄表單 42 function checkBox() { 43 /* var name = document.getElementById("dvdName").value; 44 var type = document.getElementById("dvdType").value; 45 46 if (name != ""&&type!="") { 47 return true; 48 } else { 49 document.getElementById("isEmpty").value = "EMPTY"; 50 alert("DVD信息不能為空哦~"); 51 document.getElementById("loginname").focus(); //光標占位 52 return false; 53 } */ 54 } 55 </script> 56 <body> 57 <div style="margin-left: 400px"> 58 <h1 style="margin-left: 10px;">添加DVD信息:</h1> 59 <br> 60 <form method="post" 61 action="${pageContext.request.contextPath}/ProductServlet?method=add" 62 enctype="multipart/form-data" 63 > 64 <!-- onsubmit=" return checkBox()" 65 --> <table class="gridtable"> 66 <tr> 67 <td>編號(已自動分配不可修改): 68 <div id="myDiv"> 69 </div> 70 </td> 71 <td width="300px"><input id="pr_dvdNum" type="text" name="pr_dvdNum" 72 value="${nextNum }" disabled="disabled" 73 style="border: 0px; font-size: 20px;"> 74 </td> 75 </tr> 76 <tr> 77 <td>請輸入DVD名字:</td> 78 <td width="300px"><input id="dvdName" type="text" 79 name="dvdName" style="border: 0px; font-size: 20px;"></td> 80 </tr> 81 <tr> 82 <td>請輸入DVD狀態:</td> 83 <td width="300px"><input id="dvdState" type="radio" checked 84 value="未借出" name="dvdState" style="border: 0px; font-size: 20px;">未借出 85 <input id="dvdState" type="radio" 86 value="已借出" name="dvdState" style="border: 0px; font-size: 20px;">已借出 87 </td> 88 </tr> 89 <tr>
90 <td>請傳入DVD圖片<br>必須是gif格式</td> 91 <td><input type="file" name="file" 92 style="border: 0px; font-size: 20px;" 93 /></td>
94 </tr> 95 <tr> 96 <td>請輸入DVD類型:</td> 97 <td width="300px"><input id="dvdType" type="text" 98 name="dvdType" style="border: 0px; font-size: 20px;"> 99 <input type="hidden" name="currentPage" value="${currentPage}"> 100 101 </td> 102 </tr> 103 <tr> 104 105 <td colspan="2"><input type="submit" value="添加" 106 style="width: 120px; height: 30px; background-color: blue; border: 0px; color: #fff5ee; font-size: 15px; margin-left: 180px;"> 107 <a href="${pageContext.request.contextPath}/ProductServlet?method=toMainView¤tPage=${currentPage }" style="float: right;">返回主頁</a></td> 108 </tr> 109 </table> 110 <input type="hidden" id="isEmpty" name="isEmpty" value="FULL"> 111 </form> 112 </div> 113 </body> 114 </html>
說明:由於我是直接把項目中的整個jsp頁面展示出來了,所以只需注意紅色的部分就可以了。
第四步 創建后台處理Servlet服務端
1 package com.tang.control; 2 import java.io.IOException; 3 import java.io.PrintWriter; 4 import java.sql.SQLException; 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import javax.servlet.ServletContext; 9 import javax.servlet.ServletException; 10 import javax.servlet.annotation.WebServlet; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 import javax.servlet.http.HttpSession; 15 16 import org.apache.commons.fileupload.FileItem; 17 18 import com.tang.common.Page; 19 import com.tang.dao.DvdDao; 20 import com.tang.dao.PhotoDao; 21 import com.tang.dao.UserDao; 22 import com.tang.models.DVDInfoData; 23 24 /** 25 * @author Mr Tang 26 * 27 */ 28 @WebServlet("/ProductServlet") 29 public class ProductServlet extends HttpServlet { 30 public ProductServlet() { 31 super(); 32 } 33 protected void doGet(HttpServletRequest request, 34 HttpServletResponse response) throws ServletException, IOException { 35 String method = request.getParameter("method"); 36 try { 37 switch (method) { 38 case "add": 39 //轉接給相對應的函數去處理相關數據。 40 addDVDinfo(request, response); 41 break; 42 } catch (SQLException e) { 43 // TODO Auto-generated catch block 44 e.printStackTrace(); 45 } 46 } 47 /** 48 * <p> 49 * 這個函數實現了增加dvd的功能 50 * <p> 51 * @throws SQLException 52 * @throws ServletException 53 */ 54 private static void addDVDinfo(HttpServletRequest request, HttpServletResponse response) throws IOException, SQLException, ServletException { 55 List<String> list=new ArrayList<String>(); 56 String filename=PhotoDao.getPhotoNewName(); 57 ServletContext servletContext=null; 58 servletContext=request.getSession().getServletContext(); 59 //數據庫中存儲格式:/webTest/imgs/***.jpg 60 //第一步:獲取頁面上上傳的圖片資源 61 List<FileItem> items=PhotoDao.getRequsetFileItems(request,servletContext); 62 boolean isLoadToSQL=false; 63 for(FileItem item:items) { 64 if(!item.isFormField()){ 65 //判斷后綴名是否是jpg 66 if(PhotoDao.isGif(item)) { 67 isLoadToSQL=PhotoDao.saveFile(item,filename); 68 }else { 69 System.out.println("后綴格式有誤,保存文件失敗"); 70 } 71 }else { 72 /*獲取表單中的非文件值 73 表單中的空間name值 74 System.out.println("name值: "+item.getFieldName()); 75 該name值空間中的value值 76 System.out.println(item.getString("UTF-8"));*/ 77 list.add(item.getString("UTF-8")); 78 } 79 } 80 String dvdNum=DvdDao.returnNextNum(); 81 //存在數據庫里面的照片路徑是在項目里的相對路徑 82 String finalPhotoName= request.getContextPath()+"/imgs/"+filename; 83 int bol=DvdDao.addDVD(dvdNum, "《"+list.get(0)+"》",list.get(1),list.get(2),finalPhotoName); 84 if(list.get(4).equals("FULL")) { 85 if(bol>0) { 86 PrintWriter out=response.getWriter(); 87 out.flush(); 88 out.print("<script>"); 89 out.println("alert('添加DVD信息成功!!!')"); 90 out.print("window.location.href='ProductServlet?method=toAddView¤tPage="); 91 out.print(list.get(3)); /*第四個數下標為3表示主頁的頁數*/ 92 out.print("'</script>\");"); 93 out.close(); 94 }else { 95 PrintWriter out=response.getWriter(); 96 out.flush(); 97 out.print("<script>"); 98 out.println("alert('很抱歉,添加DVD失敗,請檢查填入信息是否正確!!!')"); 99 out.println("history.back();"); 100 out.println("</script>"); 101 out.close(); 102 } 103 } 104 else if(list.get(4).equals("EMPTY")){ 105 PrintWriter out=response.getWriter(); 106 out.flush(); 107 out.print("<script>"); 108 out.print("window.location.href='ProductServlet?method=toAddView';"); 109 out.println("</script>"); 110 out.close(); 111 } 112 } 113 protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { 114 doGet(request, response); 115 } 116 }
說明:由於我是直接把項目中的整個ProductServlet頁面展示出來了,所以只需注意紅色和藍色的部分就可以了。紅色部分的代碼實現了文件存儲在項目文件里,藍色部分實現了將dvd實例化的對象存儲到數據庫中。
第五步:結果展示
附加:DVDInfoData.java 文件 和DvdDao.java 文件。(第一個是對DVD信息的封裝,第二個是把dvd信息存儲到數據庫中)
/** * @author Mr Tang * @version Create Time:2018年10月2日 下午6:39:04 * com.tang.models * */ package com.tang.models; /** * @author Mr Tang * */ public class DVDInfoData { private String dvdnum; private String dvdname; private String dvdstate; private String dvdtype; private String dvdphoto; /** * */ public DVDInfoData() { super(); } /** * @param dvdnum * @param dvdname * @param dvdstate * @param dvdtype * @param dvdphoto */ public DVDInfoData(String dvdnum, String dvdname, String dvdstate, String dvdtype, String dvdphoto) { super(); this.dvdnum = dvdnum; this.dvdname = dvdname; this.dvdstate = dvdstate; this.dvdtype = dvdtype; this.dvdphoto = dvdphoto; } }
package com.tang.dao; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import com.tang.Util.BeanHandler; import com.tang.Util.BeanListHandler; import com.tang.Util.JDBCUtil; import com.tang.models.DVDInfoData; /** * @author Mr Tang * 這個類被用來處理來自數據庫的DVD數據,增刪改查以及其他功能的實現。 * 繼承自DBUtilsBaseDao,簡化數據庫操作 */ public class DvdDao extends DBUtilsBaseDao{ /** * @author Mr Tang * @throws SQLException * @expression This method is used to show all DVD information to users. *It must be do this... */ @SuppressWarnings("unchecked") public static List<DVDInfoData> ShowAllDVD() throws SQLException{ String sql="SELECT * FROM dvddb order by dvdname desc" ; Object[] params= {}; return (List<DVDInfoData>) JDBCUtil.query(sql, params, new BeanListHandler(DVDInfoData.class)); } /** * *2018年10月21日下午11:38:46 *這個函數的功能是添加DVD信息 */ public static int addDVD(String dvdNum,String dvdName,String dvdstate,String dvdtype,String dvdphoto) throws SQLException { int result=0; if(dvdNum!=""&&dvdName!="") { Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$"); if(pattern.matcher(dvdNum).matches()){ String sql="INSERT INTO dvddb (dvdnum,dvdname,dvdstate,dvdtype,dvdphoto) VALUES (?,?,?,?,?)" ; Object[] params=new Object[]{ dvdNum, dvdName, dvdstate, dvdtype, dvdphoto }; result=JDBCUtil.update(sql, params); } } return result; } }