我的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>男&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <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包:

commons-fileupload.jar

commons-io.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类型数据库存取。的更多相关文章

  1. jsp页面往mysql里插入中文后数据库里显示乱码

    1.JSP页面乱码 这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要在页面开始地方用下面代码指定字符集编码即可,<%@ page contentType="text ...

  2. jsp页面struts2标签展示clob类型的数据

    直接从数据库中查出来的数据,是clob类型的在前端页面展示的时候是这样: 后来找到了一个方法,在action中添加一个方法,解析转换clob数据的方法 public String getClob(Cl ...

  3. jsp页面,jstl标签中的数据在<%%>java中使用

    可参考jsp的API隐式对象.. 这部分数据其实被保存在page域中,但jsp中如果使用java代码需要在特定的标签中<%%>,在这个标签中可使用的只有pageContext对象,所以可以 ...

  4. Jq_input file标签上传图片到服务器

    引入jQuery库引入ajaxfileupload.js上传插件库(这也是jQuery的一个插件)以ASP.NET为例 <input type="file" id=" ...

  5. jsp页面JSTL标签 <c:fn:>

    函数名 函数说明 使用举例 fn:contains 判断字符串是否包含另外一个字符串 <c:if test="${fn:contains(name, searchString)}&qu ...

  6. jsp页面从标签属性中获取值

    你还可以在"data-*" 属性里使用json语法,例如 <div id="awesome-json" data-awesome='{"game ...

  7. jsp页面a标签URL转码问题

    简单的办法只有一句话,在后台对传过来的字符串(value)加一句: String value = new String(value.getBytes("ISO-8859-1"),& ...

  8. jsp 页面使用标签遍历

    <tbody> <c:forEach items="${page.list}" var="exhiMain"> <c:set va ...

  9. jsp页面jstl标签库失效问题

    可能是版本低的问题,启用jstl即可解决(仅供参考) <%@ page isELIgnored="false"%>

随机推荐

  1. 注册美国iTunes账号步骤(跳过绑定银行卡)

    步骤: 将iTunes客户端升级到最新版本 注销当前登陆的用户,随便搜索一个免费的应用 点击下载,此时会弹框提示你登陆,点击下方注册超链 跳转到注册页面,同意各种条款,点击下一步 填写邮箱(最好用gm ...

  2. 能量项链 洛谷P1063

    1154 能量项链 2006年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在Mars星球上,每个M ...

  3. 关于c语言中的字符串问题

    对字符数组,字符指针,字符串常量 在csdn上看到一篇关于这方面的帖子,有所收获. JohnTitor的专栏 1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写   & ...

  4. Java反射机制调用对象的方法 —— 将一个对象的属性值赋值给另一个对象的属性

    模拟一个场景: 众所周知,EasyExcel导出Excel文档是依赖于注解完成的,在实体类需要导出的属性上面加上注解,导出的时候会自动识别该属性. 假如我们现在需要导出用户的信息,又不想污染原本的实体 ...

  5. java 文件相关问题

    1.文件路径 分隔符 System.out.println(File.separator); System.out.println(File.pathSeparator); /*mac os 和 li ...

  6. python bbs项目代码分析

    def index(request, *args, **kwargs): condition={} type_id = int(kwargs.get("type_id")) if ...

  7. 《SQL 进阶教程》 case:将已有编号方式转换为新的方式并统计

    SQL 权威指南SQL 解惑在进行非定制化统计时,需要将已有编号方式转换为另外一种便于分析的方式进行统计需求 select case when name='哈尔滨' then '黑龙江' when n ...

  8. Codeforces 1167F(计算贡献)

    要点 容易想到排序,然后对于每个数: 人的惯性思维做法是:\(a[i]*(rank1的+rank2的+-)\).然而解法巧妙之处在于直接把所有的加和当成一个系数,然后先假装所有情况系数都是1,接着往上 ...

  9. Ubuntu新服务器安装lnmp

    版本: nginx(无要求,最新) mysql(5.6.xx) php(5.6.xx) ubuntu(16.04,其他版本也并无过多差异) 准备: #apt-get update #apt-get i ...

  10. scrapy爬取美女图片

    使用scrapy爬取整个网站的图片数据.并且使用 CrawlerProcess 启动. 1 # -*- coding: utf-8 -* 2 import scrapy 3 import reques ...