实现代码
注意,需要借助一个 jar 包。在下面参考中给出了详细地址
/**
* 添加书籍
* 1.enctype="multipart/form-data":和一起不同
* 获取表单元素,req.getParameter("name"):error
* 2.文件上传:图片文件从浏览器保存到服务器端(第三方 FileUpload+id)
* 3.路径
* 注意虚拟路径和实际路径,文件存储都是要存储到实际路径中的,而访问可以通过虚拟路径
* @param req
* @param resp
* @param out
*/
private void add(HttpServletRequest req, HttpServletResponse resp, PrintWriter out) throws Exception {
// 1 构建一个磁盘工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//1.1 设置大小
factory.setSizeThreshold(1024*9);
// 1.2 临时仓库
File file = new File("D:\\IntelliJ_IDEA_Item\\bookItem\\web\\Images\\cover");
if(!file.exists()){
file.mkdir(); // 创建文件夹
}
// Repository:仓库
factory.setRepository(file);
// 2 文件上传+表单数据
ServletFileUpload fileUpload = new ServletFileUpload(factory);
// 3 将请求解析成一个 FileItem
List<FileItem> fileItems = fileUpload.parseRequest(req);
Book book = new Book();
// 4 遍历 fileItems
for (FileItem item : fileItems){
// 对应表单域标签的 name 属性
String fieldName = item.getFieldName();
// 若表单域是文件类型
if(!item.isFormField()){
// 1. 获取上传的文件名:图片的文件名 文成.png
String fileName = item.getName();
if(fileName != null && !"".equals(fileName)){
// 避免文件替换:使用 UUID
// 2 获取后缀名 .png 文件的后缀名是不变的
String filterName = fileName.substring(fileName.lastIndexOf("."));
// 3 修改文件名 12321321321.png
fileName = UUID.randomUUID() + filterName;
// 保存到哪里
// 虚拟路径:Images/cover/1-1.png
// 文件的读写:实际路径 d://xx ---> 虚拟路径: Images/cover 对应的实际路径
// 获取服务器端存储图片的实际路径
String realPath = req.getServletContext().getRealPath("/Images/cover");
// d:/xx/xxx/ 12321321321.png
String filePath = realPath + "/" + fileName;
// 数据库表中的路径: Images/cover/101-1/png: 相对项目的根目录的位置
String dbPath = "Images/cover/"+fileName;
// 将图片 url 赋给对应的成员变量
setParameter(book,fieldName,dbPath);
// 保存文件
item.write(new File(filePath));
}else{
System.out.println(fieldName + "has on img to upload");
}
// 表单域是普通类型
}else{
// 将其映射到
String fieldValue = item.getString("utf-8"); // 防止乱码
setParameter(book,fieldName,fieldValue);
}
}
// 5 将信息保存到数据库
int count = bookBiz.addBook(book);
if(count > 0){
out.println("<script>alert('添加书籍成功');location.href='book.let?type=query&pageIndex=1'</script>");
}else {
out.println("<script>alert('添加书籍失败');location.href='book_add.jsp';</script>");
}
}
/**
* 通过反射填充实体类属性字段
* @param book 实体类
* @param fieldName 字段名
* @param fieldValue 实体类属性的值
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
private void setParameter(Book book,String fieldName,String fieldValue) throws NoSuchFieldException, IllegalAccessException {
// getDeclaredField()方法返回一个Field对象,它反映此Class对象所表示的类或接口的指定已声明字段。name参数是一个字符串,指定所需的字段的简单名称。
Field field = book.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
// 将 filedValue 从字符串转换为字段类型
Object convert = ConvertUtils.convert(fieldValue, field.getType());
// 给属性赋值
field.set(book,convert);
}
参考
代码参考
https://blog.csdn.net/u010018421/article/details/52831565
jar 包下载
https://www.cnblogs.com/wansiqi/p/14052270.html