上传图片保存到mysql数据库并在网页上显示
一、將保存圖片的路徑保存到數(shù)據(jù)庫
1、前端代碼,在java中使用form表單上傳文件時form標(biāo)簽中必須加上 enctype=“multipart/form-data”。enctype:規(guī)定在發(fā)送到服務(wù)器之前應(yīng)該如何對表單數(shù)據(jù)進行編碼。有以下三個值:
(1)application/x-www-form-urlencoded:在發(fā)送前編碼所有字符(默認)。
(2)multipart/form-data :不對字符編碼。在使用包含文件上傳控件的表單時,必須使用該值。指定傳輸數(shù)據(jù)為二進制類型,比如圖片、mp3、文件。
(3)text/plain:空格轉(zhuǎn)換為 “+” 加號,但不對特殊字符編碼
2、導(dǎo)入的jar包
需要導(dǎo)入這兩個jar包:commons-fileupload-1.2.2.jar、commons-io-1.4.jar
servlet中的代碼
首先要判斷請求頭中是否含有enctype=“multipart/form-data”,不存在則返回提示。存在則設(shè)置先設(shè)置一些變量用來限制上傳的文件。sizeThreshold:內(nèi)存的臨界值,用來當(dāng)文件長度超過臨界值,就將文件寫入到臨時文件,否則就保存到內(nèi)存中。fileSizeMax:設(shè)置單個文件的最大大小。sizeMax:設(shè)置請求文件的大小,也就是上傳文件的上限。創(chuàng)建一個文件工廠factory。(注意:導(dǎo)包:org.apache.commons.fileupload.disk.DiskFileItemFactory,不要導(dǎo)錯了)設(shè)置內(nèi)存臨界值。將保存的臨時文件夾設(shè)置為系統(tǒng)的臨時文件夾。在電腦的文件資源管理器中目錄那行輸入%temp%可以查看。創(chuàng)建一個ServletFileUpload對象,設(shè)置上傳文件的編碼以及上傳文件的大小。設(shè)置一個上傳文件的路徑(不要保存到項目路徑,最好保存到項目外的路徑。保存到項目路徑存在文件丟失的情況)。使用該上傳文件的路徑創(chuàng)建一個File對象,然后判斷該路徑是否存在,不存在就創(chuàng)建。
其次創(chuàng)建一個要保存到數(shù)據(jù)庫的表的對象user。然后獲取請求中的FileItem對象并用FileItem的集合對象來接收。For循環(huán)獲取到的FileItem。在for循環(huán)中利用isFormField()方法判斷獲取到的FileItem對象里面封裝的數(shù)據(jù)是一個普通文本表單字段,還是一個文件表單字段。如果是普通文本表單字段,返回一個true否則返回一個false。如果是文件表單字段則利用getFieldName()方法用來獲取表單標(biāo)簽的name屬性的值并判斷是否和file類型的表單標(biāo)簽的name值一樣。一樣則利用File對象來獲取文件名并設(shè)置默認的文件后綴名為“jpg”。然后獲取文件擴展名。然后設(shè)置要保存的文件名和保存的文件路徑,然后將文件保存到指定的路徑。將文件名設(shè)置到user中的保存文件的字段中。然后調(diào)用service中的方法將文件名保存到mysql數(shù)據(jù)庫中。
Users users=new Users();try {List<FileItem> fileItems= upload.parseRequest(request);for (FileItem fileItem : fileItems) {if (!fileItem.isFormField()) {//文件元素if ("picture".equals(fileItem.getFieldName())) {//獲取原來的擴展名String oldName=new File(fileItem.getName()).getName();String extensionName=".jpg";//獲取擴展名稱if ((oldName != null) && (oldName.length() > 0)) { int dot = oldName.lastIndexOf('.'); if ((dot >-1) && (dot < (oldName.length() - 1))) { extensionName= oldName.substring(dot); } } //構(gòu)建文件的名稱String fileName =System.currentTimeMillis()+"_"+System.nanoTime()+extensionName;String filePath=uploadPath+File.separator+fileName;//保存文件try {fileItem.write(new File(filePath));} catch (Exception e) {e.printStackTrace();}users.setPicture(fileName);}}}//調(diào)用Service保存數(shù)據(jù)users.setOpDatetime(new Date());boolean bolS=userService.insert(users);將圖片顯示到頁面很簡單,只需要查詢保存mysql數(shù)據(jù)庫中的文件名,然后拼接上文件保存在磁盤中的路徑,返回到HTML中img標(biāo)簽中的src中即可顯示。
二、直接將圖片保存到數(shù)據(jù)庫
1、直接保存到數(shù)據(jù)庫中的代碼與保存到磁盤中然后保存文件名在數(shù)據(jù)庫中的代碼很類似。主要區(qū)別在于利用File對象中的getInputStream()方法將上傳的文件的主體內(nèi)容以流的形式保存到user對象中,并且user對象中也是以InputStream類型來接收。在dao層也是用prepareStatement對象的setBlob方法將文件保存到mysql數(shù)據(jù)庫中。
Dao層代碼保存到mysql數(shù)據(jù)庫
ps.setBlob(8, t.getUserImage());3、在頁面上顯示
**JS代碼:**調(diào)用servlet中的查詢圖片的方法,并將指定的ID傳入servlet中
Servlet代碼:獲取JSP中傳過來的ID,然后調(diào)用dao層的查詢方法,并將查詢到的數(shù)據(jù)返回
protected void HuiTianUserImage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String strUserInfoID = request.getParameter("UserInfoID");int userInfoID = Integer.parseInt(strUserInfoID);byte[] bs =userService.getUserInfoImg(userInfoID);OutputStream out = response.getOutputStream();out.write(bs);out.flush();//out.close();}**Dao層代碼:**以byte[] 類型獲取到保存的mysql中的文件的數(shù)據(jù),然后返回。
public byte[] getUserInfoImg(int ID) {byte[] bs = null;Connection con = null;PreparedStatement ps = null;ResultSet res = null;try {con = DbUntil.getConnection();ps = con.prepareStatement(getUserInfoImg);ps.setInt(1, ID);res = ps.executeQuery();while(res.next()) {Blob img = res.getBlob(1);bs = img.getBytes(1, (int)img.length());}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {DbUntil.close(con, ps, res);}return bs;}這樣既可在頁面顯示圖片
總結(jié)
以上是生活随笔為你收集整理的上传图片保存到mysql数据库并在网页上显示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsp+servlet实现个人博客系统
- 下一篇: qt连接mdb_【原创】QT数据库学习和