jsp页面file标签上传图片以及blob类型数据库存取。
我的jsp页面表单如下:
<form name="form1" action="/YiQu/AddUserServlet?jurisdiction=1" method="post" enctype="multipart/form-data"> <table align="center"> <tr> <td>用户id:</td> <td><input type="text" name="userid" ></td> </tr> <tr> <td>用户名:</td> <td><input type="text" name="username" ></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="userpassword" ></td> </tr> <tr> <td>昵称:</td> <td><input type="text" name="usernickname" ></td> </tr> <tr> <td>头像:</td> <td><input type="file" name="userpicture" accept="image/*"></td> </tr> <tr> <td>个性签名:</td> <td><input type="text" name="userdescription" ></td> </tr> <tr> <td>mabeyuse:</td> <td><input type="text" name="mabeyuse" ></td> </tr> <tr> <td>生日:</td> <td><input type="date" name="userdate" ></td> </tr> <tr> <td>性别:</td> <td><input type="radio" name="usersex" value="男" checked>男 <input type="radio" name="usersex" value="女" >女</td> </tr> <tr> <td>地址:</td> <td><input type="text" name="useraddr" ></td> </tr> <tr> <td>邮箱:</td> <td><input type="text" name="usermail" ></td> </tr> <tr> <td>电话:</td> <td><input type="text" name="usertel" ></td> </tr> <tr> <td>支付宝:</td> <td><input type="text" name="useralipayid" ></td> </tr> <tr> <td>权限:</td> <td><input type="text" name="jurisdiction" ></td> </tr> <tr> <td></td> <td><input type="submit" value="添加"></td> </tr> </table> </form> </body>
我想要后台提取file标签上传的图片,然后存到mysql数据库,一开始我使用默认方式进行提交表单,发现只能获取file标签上传图片的名字,并不能获取图片内容,
那么我就要将表单以二进制流的形式进行提交,
表单默认:enctype="application/x-www-form-urlencoded",
我需要将它改为:enctype="multipart/form-data",这时候提交的表单就是二进制流数据,
既然是以数据流上传,那么后台request.getParameter("")获取不到数据,只有经过解析后获取标签内容,
这里要用到Apache的commons-fileupload.jar 然而这个jar包基于commons-io.jar ,所以要导入这两个jar包:
导入之后编写后台接收servlet
我的servlet如下:
public class AddUserServlet extends HttpServlet { private static final long serialVersionUID = 1L; private String savePath; private ServletContext sc; public void init(ServletConfig config) { savePath="upload"; // 项目下用于存放图片的文件夹 sc = config.getServletContext(); // 获取上下文 } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); Map<String, String> map=new HashMap<>(); // 用于存储表单非二进制流部分 boolean isMultipart = ServletFileUpload.isMultipartContent(request);// 检查输入请求是否为multipart表单数据。 if (isMultipart == true) { // 如果是二进制流形式的表单 FileItemFactory factory = new DiskFileItemFactory();// 通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。 ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = null; File savedFile=null; try { items = upload.parseRequest(request); } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } Iterator<FileItem> itr = items.iterator(); while (itr.hasNext()) { FileItem item = (FileItem) itr.next(); if (item.isFormField()) {//检测是否为普通表单 如果是普通表单项目,将其名字与对应的value值放入map中。 String fieldName = item.getFieldName(); map.put(fieldName, item.getString("UTF-8"));//获取表单value时确定数据格式,如果不写,有中文的话会乱码 } else { //如果是提交的图片 File fullFile=new File(item.getName()); //获取提交的文件 savedFile=new File(sc.getRealPath("/")+savePath,fullFile.getName()); //在项目下新建该文件, try { item.write(savedFile); //写入文件 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } out.println(" Map"+map.toString()); out.println(" username="+map.get("username")); out.println(map.get("userid")+" "+ map.get("username")+" "+ map.get("userpassword")+" "+map.get("usernickname")+" "+null+" "+map.get("userdescription")+" "+map.get("mabeyuse")+" "+Date.valueOf("".equals(map.get("userdate"))?"2012-1-1":map.get("userdate"))+" "+map.get("usersex")+" "+map.get("useraddr")+" "+map.get("usermail")+" "+map.get("usertel")+" "+ map.get("useralipayid")+" "+ map.get("jurisdiction")); FileInputStream str=new FileInputStream(savedFile);//将保存的文件转换为输入流 int length=str.available();//获取输入流的长度; //下面是我将自己的普通表单内容放到User对象中 User user=new User(0, map.get("username"), map.get("userpassword"), map.get("usernickname"), null, map.get("userdescription"), Integer.parseInt(map.get("mabeyuse")==""?"0":map.get("mabeyuse")), Date.valueOf("".equals(map.get("userdate"))?"2012-1-1":map.get("userdate")), map.get("usersex"), map.get("useraddr"), map.get("usermail"), map.get("usertel"), map.get("useralipayid"), Integer.parseInt(map.get("jurisdiction")==""?"0":map.get("jurisdiction"))); UserDao userDao=new UserDaoImpl(); boolean flag=userDao.addUser(user,str,length);//这步是将user对象,输入流,和输入流的长度传到 userdao的addUser方法中 用于添加到数据库; if(flag){ response.sendRedirect("/xxx/UserServlet"); }else{ response.getWriter().print("<script type=\"text/javascript\">alert(\"添加失败\");location.href(\"/xxx/addUser.jsp\");</>"); } } else { out.print("the enctype must be multipart/form-data"); } } }
我的addUser方法如下:
//插如数据库操作,主要是 pst.setBinaryStream(4,file,length);将输入流存入数据库blob类型数据中public boolean updateUser(User user,FileInputStream file,int length) { boolean flag=true; String sql="update user set username=? ,"+" userpassword=? ," +" usernickname=? ," +" userpicture=? ," +" userdescription=? ," +" mabeyuse=? ," +" userdate=? ," +" usersex=? ," +" useraddr=? ," +" usermail=? ," +" usertel=? ," +" useralipayid=? ," +" jurisdiction=? " +"where userid=? "; try { pst=conn.prepareStatement(sql); pst.setString(1, user.getUsername()); pst.setString(2, user.getUserpassword()); pst.setString(3, user.getUsernickname()); pst.setBinaryStream(4,file,length); pst.setString(5, user.getUserdescription()); pst.setInt(6, user.getMabeyuse()); pst.setDate(7, user.getUserdate()); pst.setString(8, user.getUsersex()); pst.setString(9, user.getUseraddr()); pst.setString(10, user.getUsermail()); pst.setString(11, user.getUsertel()); pst.setString(12, user.getUseralipayid()); pst.setInt(13, user.getJurisdiction()); pst.setInt(14, user.getUserid()); flag=pst.execute(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { DBUtils.closeAll(conn, pst, res); } return !flag; }
将file标签上传内容存入数据库到这就完成了。
下面要做的是从数据库读取blob数据,并显示到jsp界面:
我的jsp显示界面如下:
<table class="tablelist"> <thead> <tr> <th><input id="allSelect" type="checkbox" value="" /></th> <th>用户编号</th> <th>用户名</th> <th>密码</th> <th>昵称</th> <th>头像</th> <th>个人描述</th> <th>maybe</th> <th>用户生日</th> <th>用户性别</th> <th>收货地址</th> <th>邮箱</th> <th>手机号</th> <th>支付宝账号</th> <th>权限</th> </tr> </thead> <tbody> <c:forEach items="${userpage.data }" var="user"> <tr> <td><input name="isSelect" id="${user.userid}" type="checkbox" onchange="selUser(${user.userid})"/></td> <td>${user.userid}</td> <td>${user.username}</td> <td>${user.userpassword}</td> <td>${user.usernickname}</td> <td><img alt="" width="100px" height="75px" src="/xxx/upload/${user.userdescription}.jpg"> </td> <td>${user.userdescription}</td> <td>${user.mabeyuse}</td> <td>${user.userdate}</td> <td>${user.usersex}</td> <td>${user.useraddr}</td> <td>${user.usermail}</td> <td>${user.usertel}</td> <td>${user.useralipayid}</td> <td>${user.jurisdiction}</td> </tr> </c:forEach> </tbody> </table>
图片用img标签显示 用src读取服务器上图片路径:
我从数据库用getBlob()方法获取blob类型数据,然后新建User对象进行封装这里就不讲了。
后台将blob数据转化为图片的代码如下:
@WebServlet("/UserServlet") public class UserServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("image/*"); request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); String scurrentpage=request.getParameter("currentpage"); if(scurrentpage==null){ scurrentpage="1"; } UserDao userDao=new UserDaoImpl(); UserPage uPage= userDao.findUserByPage(Integer.parseInt(scurrentpage), 5); List<User> list=uPage.getData(); //这里是获取分页查询到的User对象的List 下面遍历每个User for (User us : list) { if (us.getUserpicture()==null||us.getUserpicture().equals("")) { continue; }else{ try { InputStream is=us.getUserpicture().getBinaryStream(); //获取Blob类型变量 并转化为二进制输入流 if(is!=null){ String uuid=UUID.randomUUID().toString(); //给图片取个独一无二的名字 is = new BufferedInputStream(is) ; //将输入流读入缓冲区 BufferedImage bi = ImageIO.read(is) ; //利用ImageIo对象转化为Image对象 OutputStream oi=new FileOutputStream("D:/tomcat8/webapps/xxx/upload/"+uuid+".jpg");//新建输出流 保存文件到服务器指定路径 ImageIO.write(bi, "jpeg", oi); //写入文件 oi.close(); is.close(); us.setUserdescription(uuid);//我将图片名字存入User对象中,方便jsp界面读取 } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } request.setAttribute("userpage", uPage); request.getRequestDispatcher("/user.jsp").forward(request, response); } }//在jsp页面读取和读取服务器图片相同//至此向数据库存入图片,以及从数据库读取图片显示到jsp界面 均已完成。
jsp页面file标签上传图片以及blob类型数据库存取。的更多相关文章
- jsp页面往mysql里插入中文后数据库里显示乱码
1.JSP页面乱码 这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要在页面开始地方用下面代码指定字符集编码即可,<%@ page contentType="text ...
- jsp页面struts2标签展示clob类型的数据
直接从数据库中查出来的数据,是clob类型的在前端页面展示的时候是这样: 后来找到了一个方法,在action中添加一个方法,解析转换clob数据的方法 public String getClob(Cl ...
- jsp页面,jstl标签中的数据在<%%>java中使用
可参考jsp的API隐式对象.. 这部分数据其实被保存在page域中,但jsp中如果使用java代码需要在特定的标签中<%%>,在这个标签中可使用的只有pageContext对象,所以可以 ...
- Jq_input file标签上传图片到服务器
引入jQuery库引入ajaxfileupload.js上传插件库(这也是jQuery的一个插件)以ASP.NET为例 <input type="file" id=" ...
- jsp页面JSTL标签 <c:fn:>
函数名 函数说明 使用举例 fn:contains 判断字符串是否包含另外一个字符串 <c:if test="${fn:contains(name, searchString)}&qu ...
- jsp页面从标签属性中获取值
你还可以在"data-*" 属性里使用json语法,例如 <div id="awesome-json" data-awesome='{"game ...
- jsp页面a标签URL转码问题
简单的办法只有一句话,在后台对传过来的字符串(value)加一句: String value = new String(value.getBytes("ISO-8859-1"),& ...
- jsp 页面使用标签遍历
<tbody> <c:forEach items="${page.list}" var="exhiMain"> <c:set va ...
- jsp页面jstl标签库失效问题
可能是版本低的问题,启用jstl即可解决(仅供参考) <%@ page isELIgnored="false"%>
随机推荐
- VMware vs openStack对比直观优势
openStack VS VMware直观优势:1.openStack设计架构开放.生态稳定 大型国际巨头公司支持及开发参与,功能版本迭代快,相对的VMware则是封闭的商业化系统.2.基于openS ...
- 0005_Linux下的SSH连接操作
1.启动SSH服务:service sshd start 2.开机自动启动SSH:chkconfig sshd on 3.获取Linux的ip地址:ifconfig 4.连接Linux的SSH:打开x ...
- win10 安装nodejs,报错there is a problem in the windows installer package
今天重装了win10系统,开始安装各种软件,装到node的时候我崩溃了,报错there is a problem in the windows installer package··· 度娘了各种安装 ...
- Linux下使用doxygen+vim生成c语言源程序文档的方法
1.安装 doxygen 有两种获得 doxygen 的方法.可以下载预编译的可执行文件,也可以从 SVN 存储库下载源代码并自己编译.清单 1 演示的是后一种方法. 清单 1. 安装和构建 doxy ...
- Web.config中的设置 forms 中的slidingExpiration的设置
在ASP.NET 网站中,使用 Forms Authentication时,一般的设置是如下的: <authentication mode="Forms"> <f ...
- 快速部署Kubernetes集群管理
这篇文章介绍了如何快速部署一套Kubernetes集群,下面就快速开始吧! 准备工作 //关闭防火墙 systemctl stop firewalld.service systemctl disabl ...
- 洛谷P3110 [USACO14DEC]驮运Piggy Back
P3110 [USACO14DEC]驮运Piggy Back 题目描述 贝西和她的妹妹艾尔斯白天在不同的地方吃草,而在晚上他们都想回到谷仓休息.聪明的牛仔,他们想出了一个计划,以尽量减少他们在步行时花 ...
- 加权并查集(银河英雄传说,Cube Stacking)
洛谷P1196 银河英雄传说 题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展.宇宙历七九九年,银河系的两大军事集团在 ...
- VBA for AutoCAD
Download the Microsoft Visual Basic for Applications Module (VBA) 2016 Downloads AutoCAD 2016 VBA mo ...
- Python小世界:匿名函数、高阶函数、推导式
前言 木子本人搞起Python已有多年,一直觉得什么都会,但是有时候实操起来,才觉得很多底层基础的知识都没有彻底的灵活掌握. 另外,网上关于Python基础知识的各种普及已有太多太多. 附上相关大神的 ...