springMVC实现文件图片的上传下载

一、图片上传前端排版


  1.1 添加文件上传相关依赖
     
          commons-fileupload
          commons-fileupload
          1.3.3
     

  
  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;
    }

你可能感兴趣的:(spring)