SpringMVC02之CRUD和文件上传下载

目录

1.CRUD

        CRUD是4个单词的首字母,CRUD分别指增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)这4个单词的首字母。

 2. springmvc的文件上传

         2.1 添加文件上传相关依赖

         2.2 配置文件上传解析器(CommonsMultipartResolver)

        2.3 表单提交方式为method="post" enctype="multipart/form-data"

        2.4 文件项用spring提供的MultipartFile进行接收

        2.5 上传文件

         2.6 下载文件

3.文件上传三要素

4.代码


1.CRUD

CRUD是4个单词的首字母,CRUD分别指增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)这4个单词的首字母。

(1)C:Create(增加) 对应 create table table1;

(2)R:Retrieve(查询)对应 select * from table1;

(3)U:Update(更新) 对应 update table1 set col1=value1 where id=value2;

(4)D:Delete(删除)对应 delete from table1 where id=value1;

 2. springmvc的文件上传

        2.1 添加文件上传相关依赖

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

        2.2 配置文件上传解析器(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>

        2.3 表单提交方式为method="post" enctype="multipart/form-data"

        2.4 文件项用spring提供的MultipartFile进行接收

        2.5 上传文件

      注:springmvc文件上传关键代码
      File targetFile = ....;
      MultipartFile mf = ....;
      String fileName = mf.getOriginalFilename(); 
      mf.transferTo(targetFile);

        2.6 下载文件

 @RequestMapping(value="/download")
public ResponseEntity<byte[]> download(@RequestParam String fileId){

   //先根据文件id查询对应图片信息

   //下载关键代码
   File file=new File(bookFile.getUrl());
   HttpHeaders headers = new HttpHeaders();//http头信息
   String downloadFileName = new String(fileName.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);

}

3.文件上传三要素

(1)表单的提交方式必须是POST请求
(2)表单中必须有一个文件上传项:<input type=“file” name=“upload”/>,文件上传项必须有name属性和值;
(3)表单的enctype属性的值必须是multipart/form-data

4.代码

下面是数据库表:

create table t_book_file
(
  file_id varchar(32) primary key comment '文件ID',
  real_name varchar(50) not null comment '文件名称',
  content_type varchar(50) not null comment '文件类型',
  url varchar(256) not null comment '文件路径'
);

下面就是代码了:

BookFile.java

package com.zking.ssm.model;

public class BookFile {
    private String fileId;
    private String realName;
    private String contentType;
    private String url;

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

    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 String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

BookFileMapper.java

package com.zking.ssm.mapper;
import com.zking.ssm.model.BookFile;
import org.springframework.stereotype.Repository;

@Repository
public interface BookFileMapper {
    int deleteByPrimaryKey(String fileId);
    int insert(BookFile record);
    int insertSelective(BookFile record);
    BookFile selectByPrimaryKey(String fileId);
    int updateByPrimaryKeySelective(BookFile record);
    int updateByPrimaryKey(BookFile record);
}

BookFileVo

package com.zking.ssm.vo;
import com.zking.ssm.model.BookFile;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;

@Data
public class BookFileVo extends BookFile {
    //书本ID
    private Integer bookId;
    //文件对象
    private MultipartFile bFile;
}

IBookFileService

package com.zking.ssm.service;
import com.zking.ssm.model.BookFile;
import com.zking.ssm.vo.BookFileVo;
import org.springframework.stereotype.Repository;

public interface IBookFileService {
    int addBookFile(BookFileVo bookFileVo);
    BookFile selectOne(String fileId);
}

BookFileServiceImpl

package com.zking.ssm.service.impl;
import com.zking.ssm.mapper.BookFileMapper;
import com.zking.ssm.mapper.BookMapper;
import com.zking.ssm.model.Book;
import com.zking.ssm.model.BookFile;
import com.zking.ssm.service.IBookFileService;
import com.zking.ssm.vo.BookFileVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.UUID;

@Service
public class BookFileServiceImpl implements IBookFileService {

    @Autowired
    private BookFileMapper bookFileMapper;

    @Autowired
    private BookMapper bookMapper;

    @Transactional
    @Override
    public int addBookFile(BookFileVo bookFileVo) {
    //生成上传图片的FileID
    String fileID= UUID.randomUUID().toString().replace("-","");
    //新增书本图片信息t_book_file
    bookFileVo.setFileId(fileID);
    bookFileMapper.insert(bookFileVo);
    //根据书本ID修改书本的Book_image
    Book book=new Book();
    book.setBookId(bookFileVo.getBookId());
    book.setBookImage(fileID);
    bookMapper.updateBookImageById(book);
        return 1;
    }

    @Override
    public BookFile selectOne(String fileId) {
        return bookFileMapper.selectByPrimaryKey(fileId);
    }
}

BookFileController

package com.zking.ssm.controller;
import com.zking.ssm.model.BookFile;
import com.zking.ssm.service.IBookFileService;
import com.zking.ssm.service.IBookService;
import com.zking.ssm.vo.BookFileVo;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;

@Controller
@RequestMapping("/bookFile")
public class BookFileController {

    public static final String DETAIL_PATH="D:/Y1/SSM/ssm/target/ssm/uploads/";

    @Autowired
    private IBookService bookService;
    
    @Autowired
    private IBookFileService bookFileService;

    //文件上传与下载宗旨:文件从哪里来,放哪里去!!!
    /**
     * 上传:文件从客户端来,上传服务器指定位置
     */
    @RequestMapping("/upload")
    public String upload(BookFileVo bookFileVo, HttpServletRequest req){
        try {
            MultipartFile bFile = bookFileVo.getBFile();
            //图片保存路径(相对路径),例如:/uploads/1.jpg
            String filePath=DETAIL_PATH+bFile.getOriginalFilename();
            //将相对路径转换成绝对路径,例如:D:/uploads/1.jpg
            String absolutePath = this.transfor(req, filePath);
            //思路:
            //1.将客户端的图片保存到服务器上指定的位置
            bFile.transferTo(new File(absolutePath));

            //2.在t_book_file表添加一条图片记录信息
            //3.根据书本ID更新书本信息表中的book_image
            bookFileVo.setRealName(bFile.getOriginalFilename());
            bookFileVo.setContentType(bFile.getContentType());
            bookFileVo.setUrl(filePath);
            bookFileService.addBookFile(bookFileVo);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:/book/qureyBookPager";
    }

    /**
     * 下载:将服务器上指定的文件下载到客户端中
     */
    @RequestMapping(value="/download")
    public ResponseEntity<byte[]> download(HttpServletRequest req,@RequestParam String fileId){

        try {
            //先根据文件id查询对应图片信息
            BookFile bookFile = bookFileService.selectOne(fileId);
            //将相对路径转换成绝对路径
            String filePath=this.transfor(req,bookFile.getUrl());
            //下载关键代码
            File file=new File(filePath);
            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;
    }

    /**
     * 将相对路径转换成绝对路径
     * @param req
     * @param relativePath
     * @return
     */
    private String transfor(HttpServletRequest req,String relativePath){
        return req.getServletContext().getRealPath(relativePath);
    }
}

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<html>
<head>
    <%@include file="/common/head.jsp"%>
</head>
<>
<h1>Hello SpringMvc!!!</h1><br>
<div style="position: absolute;top: 10px;right: 10px"><a onclick="return confirm('确定退出吗')" href="${ctx}/user/logout">安全退出</a></div>
<shiro:hasRole name="管理员">
    <a href="${ctx}/book/toBookList">跳转到书本列表页</a>
    <a href="${ctx}/page/book/addBook">跳转到书本新增页</a><br/>
</shiro:hasRole>
</body>
</html>

bookList.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
   <%@include file="/common/head.jsp"%>
</head>
<body>
<h1>书本列表</h1>
<form action="${ctx}/book/qureyBookPager" method="post">
   <label>书本名称:</label> <input type="text" name="bookName"/>
   <input type="submit" value="查询">
</form>
<a href="${ctx}/page/book/addBook">书本新增</a>
<table width="100%" border="1" cellspacing="0" cellpadding="0">
   <tr>
      <th>书本编号</th>
      <th>书本名称</th>
      <th>书本图片</th>
      <th>书本价格</th>
      <th>书本类型</th>
      <th>操作</th>
   </tr>
   <c:forEach items="${books}" var="b">
      <tr>
         <td>${b.bookId}</td>
         <td>${b.bookName}</td>
         <td>
            <c:if test="${empty b.bookImage}">
               未上传图片
            </c:if>
            <c:if test="${not empty b.bookImage}">
               <img src="${ctx}/bookFile/download?fileId=${b.bookImage}" width="150px"/>
            </c:if>
         </td>
         <td>${b.bookPrice}</td>
         <td>${b.bookType}</td>
         <td>
            <a href="${ctx}/book/getOne?bookId=${b.bookId}&type=detail">详情</a>
            <a href="${ctx}/book/getOne?bookId=${b.bookId}&type=edit">编辑</a>
            <a onclick="return confirm('确认删除?');" href="${ctx}/book/delBook?bookId=${b.bookId}">删除</a>
            <c:if test="${empty b.bookImage}">
               <a href="${ctx}/page/book/uploadBook?bookId=${b.bookId}">文件上传</a>
            </c:if>
            <c:if test="${not empty b.bookImage}">
               <a href="${ctx}/bookFile/download?fileId=${b.bookImage}">文件下载</a>
            </c:if>
         </td>
      </tr>
   </c:forEach>
</table>
${pageBean}
</body>
</html>

我就没有把所有的代码放上来了,其他的增删改页面和我之前那些差不多,相信大家也都会了,下面是那个界面图,很简洁的一个页面,也就是i给大家做个示例,所以不要太纠结哈,功能能用就行哈!!!

 以上就是今天要讲的CRUD和文件上传下载,谢谢赏读!!!

  

  • 14
    点赞
  • 10
    收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论 11

打赏作者

天蝎座的程序媛

你的鼓励是我最大的动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值