jsp圖片上傳到資料庫,並且實現取出來
阿新 • • 發佈:2019-01-25
- 說明:基於jsp與servlet、mysql對的圖片的上傳與操作,servlet用於操作檔案的上傳。
- 實現上傳需要包檔案:commons-fileupload-1.3.2、commons-io-2.5.jar、mysql-connector-java5.1.26-bin.jar(資料庫驅動,自行下載)
- 四個檔案: 1.index.jsp(上傳頁面) 2..Upload.java(servlet 操作上傳) 3.show_img.java(取圖片) 4.show_img.jsp(顯示圖片)
- 資料庫自己在mysql裡面建好就行,圖片的型別為blob(longblog、mediublob、tinyblob)
1.index.jsp
表單需要注意的地方:
- 表單的提交方式為:post
- 表單必須帶上屬性:enctype="multipart/form-data"
以下為主要程式碼:<body> <div align="center"> <form action="Upload.java" method="post" enctype="multipart/form-data"> <table> <tr> <td>姓名:</td> <td><input id="name" type="text" name="username"> </td> </tr> <tr> <td>選擇上傳的圖片</td> <td><input id="file1" type="file"
- 2.Upload.java(主要程式碼)
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=gbk"); request.setCharacterEncoding("gbk"); response.setCharacterEncoding("gbk"); PrintWriter out = response.getWriter(); PreparedStatement pstmt;//獲得PreparedStatment物件 ,PreparedStatment執行SQL查詢語句的API,比 Statement 更快 //載入資料庫驅動 Connection con; try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e2) { System.out.println("驅動找不到"); } List Files = new ArrayList();//存取上傳檔案 String name = "";//存取上傳人姓名 DiskFileItemFactory factory = new DiskFileItemFactory(); //建立一個解析器工廠 DiskFileItemFactory fu =new DiskFileItemFactory (); //得到解析器,處理上傳的檔案資料,並將表單中每個輸入項封裝成一個FileItem 物件中 ServletFileUpload upload = new ServletFileUpload(fu); upload.setHeaderEncoding("gbk"); try { //存取表單所有資訊 List<FileItem> list = upload.parseRequest(request);//取得表單的資料內容 //此層增強for迴圈遍歷表單中有多少個上傳檔案將檔案存到list中 for(FileItem items:list){ if(items.isFormField()){//判斷是否不是檔案 if(items.getFieldName().equals("username")){ name=new String(items.getString().getBytes("ISO-8859-1"),"gbk"); System.out.println(name); } System.out.println(items.getFieldName()); }else{ Files.add(items); } } //sql插入語句 String sql ="insert into photo (username,p) values(?,?)"; for(int i=0;i<Files.size();i++){ FileItem item = (FileItem)Files.get(i);//從集合取出檔案 String filename = item.getName();//獲得檔名 InputStream file = item.getInputStream();//將檔案轉為輸入流 // read(byte[])方法,返回讀入緩衝區的總位元組數 byte[] buffer = new byte[file.available()];//將位元組陣列直接存進去資料庫就可以 file.read(buffer); try { con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "9527"); pstmt = con.prepareStatement(sql);//預處理 pstmt.setString(1, name);//將第一個佔位符(?)設值 pstmt.setBytes(2, buffer);//將第二個佔位符設值 pstmt.executeUpdate();//執行語句 file.close();//將流關閉 System.out.println("插入圖片成功"); } catch (SQLException e1) { System.out.println(e1); } } } catch (FileUploadException e2) { e2.printStackTrace(); } request.getRequestDispatcher("index.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=gbk"); request.setCharacterEncoding("gbk"); response.setCharacterEncoding("gbk"); PrintWriter out = response.getWriter(); doGet(request, response); }
上傳後的資料庫:
3.show_img.java(取圖片主要程式碼)
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/*");//設定為圖pain方式
request.setCharacterEncoding("gbk");
response.setCharacterEncoding("gbk");
Connection con;
PreparedStatement pstmt;//獲得PreparedStatement物件
ResultSet rs=null;
//通過img 的src 獲得上傳人
String username =new String(request.getParameter("username").getBytes("ISO-8859-1"),"gbk");
System.out.println(username);
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e2) {
System.out.println("驅動找不到");
}
String sql="select * from photo where username =?";
List img = new ArrayList();//存放img名字用於頁面顯示;
try{
con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "9527");
try{
//例項化PreparedStatement物件
pstmt = con.prepareStatement(sql);
pstmt.setString(1, username);//查詢條件根據上傳人查詢
rs=pstmt.executeQuery();//執行查詢
if(rs.next()){//迴圈取出所有圖片
byte[] buff =rs.getBytes("p");//圖片所在的欄位名,前面存的是byte 現在相對應的取
OutputStream os = response.getOutputStream();//獲得輸出流
os.write(buff);//將其輸出頁面
System.out.println("取出成功");
}
pstmt.close();
rs.close();
}catch(Exception e){
System.out.println("取出失敗 "+e);
}
} catch (SQLException e1) {
System.out.println(e1);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=gbk");
request.setCharacterEncoding("gbk");
response.setCharacterEncoding("gbk");
PrintWriter out = response.getWriter();
doGet(request, response);
}
4.show_img.jsp(顯示圖片) <body>
<div align="center">
<img width="400" alt="" src="show_img?username=張三">//取圖片的查詢條件
</div>
</body>
到此算是完成了,程式碼是靈活的 可根據實際情況進行修改與專案結合。如果您看了這文章有什麼更好的建議,希望能得到您的指導,謝謝寫!。如果對此不明白的可留言。
(未經允許不可轉載)