实现思路:
存:在进行上传图片时,为了防止图片名重复先使用时间戳对图片名进行重命名,然后再把图片放在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>
注意:
- 普通表单提交默认enctype=“application/x-www-form-urlencoded”;但是当表单中存在文件类型时,需要设置enctype=“multipart/form-data”,它不对字符进行编码,用于发送二进制的文件(即所有文件类型,如视频、图片、音乐、文档都可以用此类型entype);还有一种enctype="text/plain"用于发送纯文本内容。
- 表单请求方式必须为post。
- 接收时不能再用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