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"%>
随机推荐
- [codeforces161D]Distance in Tree(点分治/树形dp)
题意:求树上距离为k的点对个数: 解题关键:练习一下点分治不用容斥 而直接做的做法.注意先查询,后更新. 不过这个方法有个缺陷,每次以一个新节点为根,必须memset mp数组,或许使用map会好些, ...
- day1 java基础回顾-多线程
启动线程方式 方式一:继承Thread. 1. 自定义一个类继承Thread类. 2. 重写Thread的run方法,把自定义线程的任务代码定义在run方法上. 3. 创建Thread子类的对象,并且 ...
- ASP.NET Core分布式项目实战
ASP.NET Core开发者成长路线图 asp.net core 官方文档 https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/ ...
- 利用html5看雪花飘落的效果
html5飘落的雪花堆积动画特效 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-T ...
- Google Analytics添加到网站
把Google Analytics添加到网站的具体方式 https://developers.google.com/analytics/devguides/collection/analyticsjs ...
- 2019计蒜之道初赛3 D. 阿里巴巴协助征战SARS(困难)(大数取余+欧拉降幂)
阿里巴巴协助征战SARS(困难) 33.29% 1000ms 262144K 目前,SARS 病毒的研究在世界范围内进行,经科学家研究发现,该病毒及其变种的 DNA 的一条单链中,胞嘧啶.腺嘧啶均 ...
- day01-HTML(1)
一. 常用快捷键 Ctrl+c 复制 Ctrl+v 粘贴 Ctrl+x 剪切 Ctrl+a 全选 Ctrl+s 保存 Ctrl+z 撤销一步 Windows+d 返回桌面 Windows+e 我的电脑 ...
- .net core 高吞吐远程方法调用组件XRPC
XRPC的目标非常明确,就是给.net core平台实现一个百万级别的远程方法调用RPC通讯组件.它的设计理念和GRPC一样,基于连接复用的机制实现高吞的性能:XRPC采用了HTTP2复用的思想,在协 ...
- SAP中对于获取订单的状态
在SAP中对于如何获取订单的状态,提供了至少两个函数,分别是 STATUS_READ 和 STATUS_TEXT_EDIT.下面简单介绍这两个函数 1.STATUS_READ 改函数的实现原理大 ...
- angularJs 自定义指令传值---父级与子级之间的通信
angularJs自定义指令用法我忽略,之前有写过,这里只说一下父子级之间如何传值: 例如: 模块我定义为myApp,index.html定义 <my-html bol-val="bo ...