基于SpringMVC文件上传与下载

首先我用到了两张表

我们以书本表书本文件表为例:
书本表
书本文件表
表结构分明

能看到书本表中的bookimage列段是书本文件表的主键

废话不多说直接上代码
一、添加pom依赖

     <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.3</version>
      </dependency>

二、在Spring-mvc.xml文件上配置传解析器(CommonsMultipartResolver)

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 必须和用户JSP 的pageEncoding属性一致,以便正确解析表单的内容 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 文件最大大小(字节) 1024*1024*50=50M-->
        <property name="maxUploadSize" value="52428800"></property>
        <!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常-->
        <property name="resolveLazily" value="true"/>
    </bean>

三、我定义了三个实体类

public class Book  implements Serializable{


    private Integer id;
    private String bookname;
    private Float price;
    private String booktype;
    private String bookimage;
    
public Book(Integer id, String bookname, Float price, String booktype, String bookimage) {
        this.id = id;
        this.bookname = bookname;
        this.price = price;
        this.booktype = booktype;
        this.bookimage = bookimage;
    }

    public Book() {
        super();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBookname() {
        return bookname;
    }

    public void setBookname(String bookname) {
        this.bookname = bookname;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }

    public String getBooktype() {
        return booktype;
    }

    public void setBooktype(String booktype) {
        this.booktype = booktype;
    }

    public String getBookimage() {
        return bookimage;
    }

    public void setBookimage(String bookimage) {
        this.bookimage = bookimage;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookname='" + bookname + '\'' +
                ", price=" + price +
                ", booktype='" + booktype + '\'' +
                ", bookimage='" + bookimage + '\'' +
                '}';
    }
}
public class BookFile implements Serializable{
    private String fileId;

    private String realName;

    private String contentType;

    private Date createdate;

    public BookFile(String fileId, String realName, String contentType, Date createdate) {
        this.fileId = fileId;
        this.realName = realName;
        this.contentType = contentType;
        this.createdate = createdate;
    }

    public BookFile() {
        super();
    }

    public String getFileId() {
        return fileId;
    }

    public void setFileId(String fileId) {
        this.fileId = fileId;
    }

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }

    public String getContentType() {
        return contentType;
    }

    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

    public Date getCreatedate() {
        return createdate;
    }

    public void setCreatedate(Date createdate) {
        this.createdate = createdate;
    }
}
public class BookFileVo extends BookFile implements Serializable{

	private Integer id;//书本id
	private MultipartFile bookFile;//书本文件(图片)
	
	public Integer getId() {
	    return id;
	}
	
	public void setId(Integer id) {
	    this.id = id;
	}
	
	public MultipartFile getBookFile() {
	    return bookFile;
	}
	
	public void setBookFile(MultipartFile bookFile) {
	    this.bookFile = bookFile;
	}
	
	
}
	

注意:bookFileVo是继承于bookFile
四、Controller层


@Controller
@RequestMapping("/bookFile")
public class BookFileController {
    private final  String DEFUALT_PATH="/uploads";

    @Autowired
    private IBookService bookServicel;
    @Autowired
    private IBookFileService bookFileService;
    @RequestMapping("/upload")
    public String upload(HttpServletRequest request, BookFileVo bookFileVo){
        //拿到bookFileVo中的MultiparFile  可以把他看作上传的图片
        MultipartFile bookFile = bookFileVo.getBookFile();

        Book book=new Book();
        String fileId= UUID.randomUUID().toString().replace("-", "");
        book.setBookimage(fileId);
        book.setId(bookFileVo.getId());

        bookFileVo.setFileId(fileId);
        bookFileVo.setContentType(bookFile.getContentType());
        bookFileVo.setRealName(bookFile.getOriginalFilename());


        //调用Servicel层的方法 作用是改变书本bookimage  新增bookFile
        bookServicel.updateBookImage(book,bookFileVo);


        //上传文件
        String relativePath=DEFUALT_PATH+ File.separator+bookFile.getOriginalFilename();//拿到文件名称
        String realPath=request.getServletContext().getRealPath(relativePath);  //转换成绝对路径

        try {
            bookFile.transferTo(new File(realPath));  //上传文件  一行代码
        }catch (Exception e){
            e.printStackTrace();
        }

        return "redirect:/book/queryBookPager";  //重定向跳转到jsp
    }
}

updateBookImage方法

/*
* 要执行两条sql语句
* */
@Override
@Transactional
public void updateBookImage(Book book,BookFile bookFile) {
    bookMapper.updateBookImage(book);
    bookFileMapper.insert(bookFile);
}

文件上传其实很简单
就一行代码 bookFile.transferTo(new File(realPath));前面只是做铺垫。

文件下载
在Controller层定义方法


@Controller
@RequestMapping("/bookFile")
public class BookFileController {
    private final  String DEFUALT_PATH="/uploads";

    @Autowired
    private IBookService bookServicel;
    @Autowired
    private IBookFileService bookFileService;   

    @RequestMapping(value="/download")
    public ResponseEntity<byte[]> download(HttpServletRequest request,@RequestParam String fileId){
        try{
            //先根据文件id查询对应图片信息
            BookFile bookFile = bookFileService.selectByPrimaryKey(fileId);
            //上传文件
            String relativePath=DEFUALT_PATH+ File.separator+bookFile.getRealName();//得到相对路径
            String realPath=request.getServletContext().getRealPath(relativePath);//转为绝对路径


            //下载关键代码
            File file=new File(realPath);
            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);
            //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);

        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }


}

Service层:

@Service
public class BookFileServiceImpl implements IBookFileService {
    @Autowired
    private BookFileMapper bookFileMapper;
    @Override
    public BookFile selectByPrimaryKey(String fileId) {
        return bookFileMapper.selectByPrimaryKey(fileId);
    }
}

ok 完毕 应该很好理解把

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值