jsp+servlet+Mysql 存储图片路径到数据库

实现思路:

存:在进行上传图片时,为了防止图片名重复先使用时间戳对图片名进行重命名,然后再把图片放在Web项目路径下,最后把图片的路径存放在数据库中。
取:从数据库中取出相应的图片路径,回显到前端页面

工具:
  • IDEA
  • Mysql
  • fileUpload

实现步骤

1:导入依赖jar包
  • commons-fileUpload.jar
  • commons-io.jar

使用fileUpload组件首先需要引入的·两个jar包

2:数据库操作准备
  • 创建用户表
-- 创建用户表
CREATE TABLE blogger(
	blogger_id INT PRIMARY KEY auto_increment,
	name_id VARCHAR(50) NOT NULL UNIQUE,
	nick_name VARCHAR(50) NOT NULL UNIQUE,
	gender TINYINT,
	header_por VARCHAR(80)
)

存储图片的字段(header_por)类型是字符型,用来存储图片路径

  • 用户表实体映射
    Blogger.java
public class Blogger {
    private int blogger_id;
    private String name_id;
    private String nick_name;
    private Integer gender;
    private String header_por;
    private String email;
    private String brief_intro;
    private String pass;
    private int state;
    private String active_code;
    private Integer expire_time;

    public int getBlogger_id() {
        return blogger_id;
    }

    public void setBlogger_id(int blogger_id) {
        this.blogger_id = blogger_id;
    }

    public String getName_id() {
        return name_id;
    }

    public void setName_id(String name_id) {
        this.name_id = name_id;
    }

    public String getNick_name() {
        return nick_name;
    }

    public void setNick_name(String nick_name) {
        this.nick_name = nick_name;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public String getHeader_por() {
        return header_por;
    }

    public void setHeader_por(String header_por) {
        this.header_por = header_por;
    }
    }
}

  • Dao层操作数据库存贮图片路径
    bloggerDao.java
public class BloggerDao {
    JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
	// 修改头像
    public int updateHead(int id,String headUrl) {
        String sql = "update blogger set header_por = ? where blogger_id = ?";
        int n = template.update(sql,headUrl,id);
        return n;
    }
}

3:servlet编写
@WebServlet("/uploadImageServlet")
public class UploadImageServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        Object file = request.getParameter("file");
        Blogger blogger = (Blogger) session.getAttribute("blogger");//获取到登录时存入session里的用户对象
        String headUrl = "";  //存放头像图片路径
        String headImgFileName = "headImage";  //Web项目中存放图片的文件夹名。可自定义
        // 判断上传表单是否为multipart/form-data类型
        if (ServletFileUpload.isMultipartContent(request)) {
            try {
                // 1. 创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录
                DiskFileItemFactory factory = new DiskFileItemFactory();
                // System.out.println(System.getProperty("java.io.tmpdir"));//默认临时文件夹
                // 2. 创建ServletFileUpload对象,并设置上传文件的大小限制。
                ServletFileUpload sfu = new ServletFileUpload(factory);
                sfu.setSizeMax(10 * 1024 * 1024);// 以byte为单位 不能超过10M 1024byte =
                // 1kb 1024kb=1M 1024M = 1G
                sfu.setHeaderEncoding("utf-8");
                // 3.调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。
                @SuppressWarnings("unchecked")
                List<FileItem> fileItemList = sfu.parseRequest(request);
                Iterator<FileItem> fileItems = fileItemList.iterator();
                // 4. 遍历list,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件
                while (fileItems.hasNext()) {
                    FileItem fileItem = fileItems.next();
                    // 普通表单元素
                    if (fileItem.isFormField()) {
                        String name = fileItem.getFieldName();// name属性值
                        String value = fileItem.getString("utf-8");// name对应的value值
                        System.out.println(name + " = " + value);
                    }
                    // <input Type="file">的上传文件的元素
                    else {
                        String fileName = fileItem.getName();// 上传的文件名称
                        System.out.println("原文件名:" + fileName);// Monkey.jpg
                        String suffix = fileName.substring(fileName.lastIndexOf('.'));//获取文件扩展名
                        System.out.println("扩展名:" + suffix);// .jpg
                        // 新文件名(唯一)
                        String newFileName = new Date().getTime() + suffix;
                        System.out.println("新文件名:" + newFileName);// 1478509873038.jpg
                        // 5. 调用FileItem的write()方法,写入文件

                        //文件存储位置
                        ServletContext context = this.getServletContext();
                        // 获取绝对路径
                        String serverPath = context.getRealPath("")+headImgFileName;//
                        System.out.println(serverPath);
                        // 如果存放头像的文件夹不存在则创建
                        File headFile = new File(serverPath);
                        if (!headFile.exists()) {
                            headFile.mkdirs();
                        }
                        //将图片存入文件夹
                        File headImage = new File(serverPath,newFileName);
                        // 将上传的文件写到服务器上指定的文件。
                        fileItem.write(headImage);
                        // 6. 调用FileItem的delete()方法,删除临时文件
                        fileItem.delete();
                        
                        //7:接下来就是把图片路径(headUrl)存储到自己的数据库中去了
                        headUrl = headImgFileName+"/"+newFileName; // 拼接相对路径 headImage/1478509873038.jpg
                        System.out.println(headUrl);
                        // 自己的把图片路径存储到数据库中的操作,,,,,,
                        BloggerDao bloggerDao = new BloggerDao();
                        if(bloggerDao.updateHead(blogger.getBlogger_id(),headUrl) > 0) {
                            System.out.println("修改头像图片地址成功");
                            //存储成功后,把路径存到session里面,重定向到提交图片的界面,进行回显
                            session.setAttribute("headUrl",headUrl);
                            response.sendRedirect(" ../jsp/blogger.jsp");
                        } else {                           
                        	System.out.println("头像路径更改失败");
                        }
                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
        System.out.println("请求格式错误");
    }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }

注意:上面代码最后有一个存储图片路径到数据库的操作,需要自己编写,就是简单地数据库操作,相信大家肯定都会

4:jsp编写

blogger.jsp

<form id="headImgForm" method="post"enctype="multipart/form-data">
	//  ../${blogger.header_por}是数据回显,当数据库存储之后,把上传的图片路径存储在session里,前端直接获取session里路径的值,显示图片。这里是相对路径,大家需要根据先jsp文件所在的位置与Web项目下存储图片的位置编写自己的相对路径
    <img src="../${blogger.header_por}" class="head" id="image">
    <input type="file" name="files" id="file">
    <input type="submit" value="上传头像"/>
</form>

注意:

  1. 普通表单提交默认enctype=“application/x-www-form-urlencoded”;但是当表单中存在文件类型时,需要设置enctype=“multipart/form-data”,它不对字符进行编码,用于发送二进制的文件(即所有文件类型,如视频、图片、音乐、文档都可以用此类型entype);还有一种enctype="text/plain"用于发送纯文本内容。
  2. 表单请求方式必须为post。
  3. 接收时不能再用request.getParameter(),而是request.getInputStream()解析二进制流,得到ServletInputStream对象。
大功告成

这样就可以完成了jsp+servlet+Mysql 在数据库中的存取操作了

如果大家想了解学习更多有关FileUpload的知识,可以看看这篇博客:
java web文件上传——FileUpload

参考文章链接

https://www.jb51.net/article/107000.html
https://blog.csdn.net/linghuainian/article/details/82253247

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章