在學習中遇到要求上傳圖片的問題
下面是表單的具體數據:
這裏的表單提交的Action就進入後臺頁面獲取數據:
但是不能通過簡單的數據封裝,需要把圖片給保存到數據庫,但是用什麼方式保存圖片到數據庫,並且能夠快速讀出來
思考到這裏就開始第二步:
public void addBook(HttpServletRequest request, HttpServletResponse response) {
Book book = uploadBook(request);
}
/**
* 單獨封裝數據Book
*/
protected Book uploadBook(HttpServletRequest request) {
//處理文件的上傳
Book book = new Book();
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload load = new ServletFileUpload(factory);
List<FileItem> list = load.parseRequest(request);
} catch (Exception e) {
}
}在這裏插入代碼片
這裏需要的jar什麼就不再述說了!上來就是apache的創建,接受一個request把表單的所有的數據給封裝成爲一個List集合,但是泛型是,這裏我們先輸出集合集合,這樣更加有利於我們理解:
下面是debug模式輸出list集合的FileItem
可以發現除了type類型是file的input輸入框的isFormFiled是true;
可以用設個屬性來判斷哪個屬性是file就可以進行邏輯分析
List<FileItem> list = load.parseRequest(request);
for(int i = 0;i<list.size();i++){
FileItem item = list.get(i);
if (item.isFormField()){
//獲取屬性
String fieldName = item.getFieldName();
//獲取我們輸入的值
String fieldValue = item.getString("utf-8");
//可以輸出看看是什麼
System.out.println(fieldName+"--->"+fieldValue);
}
}
輸出的值是:
name--->網易音樂熱評
author--->小明
price--->99.99
des--->新垣結衣
categoryId--->0d1ea491-62f9-4a8d-82bd-ec077a08e034
這裏獲取的就是頁面對應的name和value裏面的值
到這裏就可以利用BeanUtils來封裝數據模型
if (item.isFormField()){
//獲取屬性
String fieldName = item.getFieldName();
//獲取我們輸入的值
String fieldValue = item.getString("utf-8");
//可以輸出看看是什麼
//System.out.println(fieldName+"--->"+fieldValue);
//利用BeanUtils來封裝數據(獲取的屬性name 必須和傳入的book屬性一一對應)
BeanUtils.setProperty(book,fieldName,fieldValue);
//單獨處理分類的id
if ("categoryId".equals(fieldName)){
//調用業務邏輯
Category category = businessService.findCategoryById(fieldValue);
//添加book裏面的屬性
book.setCategory(category);
}
到此爲止我們已經把type類型不是file的都完成了封裝了
下面就是重點如何處理file類型的type
//獲取傳入圖片的所有名稱(就是把你上傳文件的名字獲取)
String file_name = item.getName();
//獲取文件的擴展名(jpg npg)這個是工具類的方法
String extension = FilenameUtils.getExtension(file_name);
//隨機生成文件的名字(需要改變圖片的名稱)
file_name = UUID.randomUUID().toString()+"."+extension;
//把路徑保存到book
book.setFilename(file_name);
//開始玩一些好玩的
//獲取文件要保存的路徑
//獲取文件的要保存的文件夾
String rootDirectory = this.getServletContext().getRealPath("/images");
//System.out.println("1-->"+rootDirectory);//D:\workhard\out\artifacts\day27_book_war_exploded\images
//根絕文件夾名稱創建圖片要保存的文件夾
//在idea中如果不創建那麼也就是爲空那程序在這裏就會報錯誤
String childPath = getStoreDirecotry(rootDirectory);
//System.out.println("2-->"+childPath);
book.setPath(childPath);
//繼續
String str = rootDirectory+File.separator+childPath+File.separator+file_name;
//System.out.println(str);//D:\workhard\out\artifacts\day27_book_war_exploded\images\2018-12-19\2fd7f4cd-8287-47a7-91d0-555655755321.jpg
//文件上傳 這個是工具類的裏面的方法
item.write(new File(str));
以下是工具類的獲取文件名稱的方法
private String getStoreDirecotry(String rootDirectory) {
Date now = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String path = df.format(now);
File file = new File(rootDirectory,path);
if(!file.exists()){
file.mkdirs();
}
return path;
}
以上就是上傳文件的方法
所有的代碼如下:
/**
* 單獨封裝數據Book
*/
protected Book uploadBook(HttpServletRequest request, BusinessService businessService) {
//處理文件的上傳
Book book = new Book();
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload load = new ServletFileUpload(factory);
List<FileItem> list = load.parseRequest(request);
for (int i = 0; i < list.size(); i++) {
FileItem item = list.get(i);
if (item.isFormField()) {
//獲取屬性
String fieldName = item.getFieldName();
//獲取我們輸入的值
String fieldValue = item.getString("utf-8");
//可以輸出看看是什麼
//System.out.println(fieldName+"--->"+fieldValue);
//利用BeanUtils來封裝數據(獲取的屬性name 必須和傳入的book屬性一一對應)
BeanUtils.setProperty(book, fieldName, fieldValue);
//單獨處理分類的id
if ("categoryId".equals(fieldName)) {
//調用業務邏輯
Category category = businessService.findCategoryById(fieldValue);
//添加book裏面的屬性
book.setCategory(category);
}
} else {
//獲取傳入圖片的所有名稱
String file_name = item.getName();
//獲取文件的擴展名(jpg npg)
String extension = FilenameUtils.getExtension(file_name);
file_name = UUID.randomUUID().toString()+"."+extension;
//把路徑保存到book
book.setFilename(file_name);
//開始玩一些好玩的
//獲取文件要保存的路徑
String rootDirectory = this.getServletContext().getRealPath("/images");
//System.out.println("1-->"+rootDirectory);//D:\workhard\out\artifacts\day27_book_war_exploded\images
String childPath = getStoreDirecotry(rootDirectory);
//System.out.println("2-->"+childPath);
book.setPath(childPath);
//繼續
String str = rootDirectory+File.separator+childPath+File.separator+file_name;
//System.out.println(str);//D:\workhard\out\artifacts\day27_book_war_exploded\images\2018-12-19\2fd7f4cd-8287-47a7-91d0-555655755321.jpg
//文件上傳
item.write(new File(str));
}
}
} catch (Exception e) {
}
return book;
}
//這是隨機獲取文件名稱的方法
private String getStoreDirecotry(String rootDirectory) {
Date now = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String path = df.format(now);
File file = new File(rootDirectory,path);
if(!file.exists()){
file.mkdirs();
}
return path;
}
這是基於Servlet的文件的上傳方法