上传图片保存到mysql数据库并在网页上显示
一、將保存圖片的路徑保存到數據庫
1、前端代碼,在java中使用form表單上傳文件時form標簽中必須加上 enctype=“multipart/form-data”。enctype:規定在發送到服務器之前應該如何對表單數據進行編碼。有以下三個值:
(1)application/x-www-form-urlencoded:在發送前編碼所有字符(默認)。
(2)multipart/form-data :不對字符編碼。在使用包含文件上傳控件的表單時,必須使用該值。指定傳輸數據為二進制類型,比如圖片、mp3、文件。
(3)text/plain:空格轉換為 “+” 加號,但不對特殊字符編碼
2、導入的jar包
需要導入這兩個jar包:commons-fileupload-1.2.2.jar、commons-io-1.4.jar
servlet中的代碼
首先要判斷請求頭中是否含有enctype=“multipart/form-data”,不存在則返回提示。存在則設置先設置一些變量用來限制上傳的文件。sizeThreshold:內存的臨界值,用來當文件長度超過臨界值,就將文件寫入到臨時文件,否則就保存到內存中。fileSizeMax:設置單個文件的最大大小。sizeMax:設置請求文件的大小,也就是上傳文件的上限。創建一個文件工廠factory。(注意:導包:org.apache.commons.fileupload.disk.DiskFileItemFactory,不要導錯了)設置內存臨界值。將保存的臨時文件夾設置為系統的臨時文件夾。在電腦的文件資源管理器中目錄那行輸入%temp%可以查看。創建一個ServletFileUpload對象,設置上傳文件的編碼以及上傳文件的大小。設置一個上傳文件的路徑(不要保存到項目路徑,最好保存到項目外的路徑。保存到項目路徑存在文件丟失的情況)。使用該上傳文件的路徑創建一個File對象,然后判斷該路徑是否存在,不存在就創建。
其次創建一個要保存到數據庫的表的對象user。然后獲取請求中的FileItem對象并用FileItem的集合對象來接收。For循環獲取到的FileItem。在for循環中利用isFormField()方法判斷獲取到的FileItem對象里面封裝的數據是一個普通文本表單字段,還是一個文件表單字段。如果是普通文本表單字段,返回一個true否則返回一個false。如果是文件表單字段則利用getFieldName()方法用來獲取表單標簽的name屬性的值并判斷是否和file類型的表單標簽的name值一樣。一樣則利用File對象來獲取文件名并設置默認的文件后綴名為“jpg”。然后獲取文件擴展名。然后設置要保存的文件名和保存的文件路徑,然后將文件保存到指定的路徑。將文件名設置到user中的保存文件的字段中。然后調用service中的方法將文件名保存到mysql數據庫中。
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); } } //構建文件的名稱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);}}}//調用Service保存數據users.setOpDatetime(new Date());boolean bolS=userService.insert(users);將圖片顯示到頁面很簡單,只需要查詢保存mysql數據庫中的文件名,然后拼接上文件保存在磁盤中的路徑,返回到HTML中img標簽中的src中即可顯示。
二、直接將圖片保存到數據庫
1、直接保存到數據庫中的代碼與保存到磁盤中然后保存文件名在數據庫中的代碼很類似。主要區別在于利用File對象中的getInputStream()方法將上傳的文件的主體內容以流的形式保存到user對象中,并且user對象中也是以InputStream類型來接收。在dao層也是用prepareStatement對象的setBlob方法將文件保存到mysql數據庫中。
Dao層代碼保存到mysql數據庫
ps.setBlob(8, t.getUserImage());3、在頁面上顯示
**JS代碼:**調用servlet中的查詢圖片的方法,并將指定的ID傳入servlet中
Servlet代碼:獲取JSP中傳過來的ID,然后調用dao層的查詢方法,并將查詢到的數據返回
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中的文件的數據,然后返回。
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;}這樣既可在頁面顯示圖片
總結
以上是生活随笔為你收集整理的上传图片保存到mysql数据库并在网页上显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsp+servlet实现个人博客系统
- 下一篇: sda、sdb、sdc、sda1、sda