實現思路:
存:在進行上傳圖片時,爲了防止圖片名重複先使用時間戳對圖片名進行重命名,然後再把圖片放在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