- 说明:基于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" 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>
到此算是完成了,代码是灵活的 可根据实际情况进行修改与项目结合。如果您看了这文章有什么更好的建议,希望能得到您的指导,谢谢写!。如果对此不明白的可留言。
(未经允许不可转载)