在学习中遇到要求上传图片的问题
下面是表单的具体数据:
这里的表单提交的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的文件的上传方法