1.1 添加文件上传相关依赖
1.2 配置文件上传解析器(CommonsMultipartResolver)
1.3 文件项用spring提供的MultipartFile进行接收
package com.zking.ssm.vo;
import com.zking.ssm.model.BookFile;
import lombok.Builder;
import lombok.ToString;
import org.springframework.web.multipart.MultipartFile;
@ToString
@Builder
public class BookVo extends BookFile {
private Integer bookId;
private MultipartFile bFile;
public Integer getBookId() {
return bookId;
}
public void setBookId(Integer bookId) {
this.bookId = bookId;
}
public MultipartFile getbFile() {
return bFile;
}
public void setbFile(MultipartFile bFile) {
this.bFile = bFile;
}
public BookVo() {
}
public BookVo(Integer bookId, MultipartFile bFile) {
this.bookId = bookId;
this.bFile = bFile;
}
}
1.4 新建文件上传页面 uploadBook.jsp,表单提交方式为method="post"
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="/static/comment/head.jsp"%>
Title
图片上传!
更新书本表里面的书本图片编号字段
定义方法
void updateBookImagesByBookId(Book book);
编写sql
update tb_book set book_images=#{bookImages}
where book_id = #{bookId}
往书本图片表里面增加图片数据
定义方法
int insert(BookFile record);
编写sql
insert into t_book_file (file_id, real_name, content_type,
url)
values (#{fileId,jdbcType=VARCHAR}, #{realName,jdbcType=VARCHAR}, #{contentType,jdbcType=VARCHAR},
#{url,jdbcType=VARCHAR})
serivce层实现类
@Service
public class BookFileMapperImpl implements IBookFileService {
/**
* 更新书本表里面的书本图片编号字段
* 往书本图片表里面增加图片数据
*/
@Autowired
public BookMapper bookMapper;
@Autowired
private BookFileMapper bookFileMapper;
@Override
public int insert(BookVo record) {
//1.给BookVo对象的编号赋值、
String fileId = UUID.randomUUID().toString().replace("-", "");
record.setFileId(fileId);
//2.往书本图片表里面增加书本图片信息
bookFileMapper.insert(record);
//3.更新书本表书本图片编号字段、
bookMapper.updateBookImagesByBookId(Book.builder()
.bookId(record.getBookId())
.bookImages(fileId).build());
return 0;
}
}
Controller层
@Controller
@RequestMapping("/bookFile")
public class BookFileController {
@Autowired
private IBookFileService bookFileService;
// 定义图片保存的默认位置
private static final String DEFAULT_PATH = "/uploads/";// 需要在项目的webapp目录创建该文件夹
@RequestMapping("/upload")
public String upload(BookVo bookFileVo, HttpServletRequest req){
try {
// 1.获取前端提交的文件对象。
MultipartFile bFile = bookFileVo.getbFile();
System.out.println("bFile = " + bFile);
// 2.获取文件名。
String filename = bFile.getOriginalFilename();
// 3.获取文件类型。
String contentType = bFile.getContentType();
// 4.拼接保存图片相对的路径(默认保存路径+图片名)-数据库保存路径
String path = DEFAULT_PATH + filename;
// 5.通过转换图片路径方法获取保存图片的绝对路径(保存在本地的绝对路径)
String filePath = transfor(path,req);
// 6.给bookFileVo参数的文件类型、文件名字和文件路径属性赋值
bookFileVo.setContentType(contentType);
bookFileVo.setRealName(filename);
bookFileVo.setUrl(path);
// 7.调用保存书本图片文件的方法(更新数据表tb_book_file和tb_book的数据)
bookFileService.insert(bookFileVo);
// 8.将上传的图片保存到电脑指定的w物理位置(读流和写流)
bFile.transferTo(new File(filePath));
}catch (Exception e){
e.printStackTrace();
}
// 最后跳转到 BookController里面的queryBookPager方法进行数据更新
return "redirect:/book/queryBookPager";
}
// 转换图片路径方法:将相对路径转换成绝对路径
private String transfor(String relativePath, HttpServletRequest req){
return req.getServletContext().getRealPath(relativePath);
}
}
定义方法
BookFile selectByPrimaryKey(String fileId);
编写sql
controller层
@RequestMapping("/download")
public ResponseEntity download(String fileId, HttpServletRequest req){
try {
// 1.先根据前端传来的文件id查询对应图片信息
BookFile bookFile = bookFileService.selectByPrimaryKey(fileId);
// 2.从数据表 tb_book_file里面获取的图片路径是一个相对路径,通过 transfor方法要转换成绝对路径。
String path = this.transfor(bookFile.getUrl(), req);
// 3.将转换后的绝对路径赋给 file 对象,然后开始下载。
File file=new File(path);
HttpHeaders headers = new HttpHeaders();//http头信息
String downloadFileName = new String(bookFile.getRealName().getBytes("UTF-8"),
"iso-8859-1");//设置编码
headers.setContentDispositionFormData("attachment", downloadFileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
// 如果没有抛出异常,则开始下载,返回的状态是 ok,使用的是浏览器默认的下载模式。返回byte数组(二进制流)
return new ResponseEntity(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
} catch (IOException e) {
e.printStackTrace();
}
// 如果下载失败就返回 null
return null;
}