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>

到此算是完成了,代码是灵活的 可根据实际情况进行修改与项目结合。如果您看了这文章有什么更好的建议,希望能得到您的指导,谢谢写!。如果对此不明白的可留言。

(未经允许不可转载)



  • 17
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值