1. 程式人生 > >jsp圖片上傳到資料庫,並且實現取出來

jsp圖片上傳到資料庫,並且實現取出來

  1. 說明:基於jsp與servlet、mysql對的圖片的上傳與操作,servlet用於操作檔案的上傳。
  2. 實現上傳需要包檔案:commons-fileupload-1.3.2、commons-io-2.5.jar、mysql-connector-java5.1.26-bin.jar(資料庫驅動,自行下載)
  3. 四個檔案:  1.index.jsp(上傳頁面)  2..Upload.java(servlet 操作上傳)  3.show_img.java(取圖片)   4.show_img.jsp(顯示圖片) 
  4. 資料庫自己在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"
    name="Filename"> </td> </tr> <tr> <td align="center" colspan="2"><input id="button" type="submit" value="上傳"> <a id="a" href="show_img.jsp">檢視上傳圖片</a> </td> </tr> </table> </form> </div> </body>

  • 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>

到此算是完成了,程式碼是靈活的 可根據實際情況進行修改與專案結合。如果您看了這文章有什麼更好的建議,希望能得到您的指導,謝謝寫!。如果對此不明白的可留言。

(未經允許不可轉載)