前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SpringMVC02之CRUD和文件上传下载

SpringMVC02之CRUD和文件上传下载

作者头像
天蝎座的程序媛
发布2022-11-18 21:12:26
发布2022-11-18 21:12:26
33400
代码可运行
举报
运行总次数:0
代码可运行

目录

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 添加文件上传相关依赖

代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
     <groupId>commons-fileupload</groupId>
     <artifactId>commons-fileupload</artifactId>
     <version>1.3.3</version>
</dependency>

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

代码语言:javascript
代码运行次数:0
运行
复制
<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 下载文件

代码语言:javascript
代码运行次数:0
运行
复制
 @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.代码

下面是数据库表:

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
<%@ 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

代码语言:javascript
代码运行次数:0
运行
复制
<%@ 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和文件上传下载,谢谢赏读!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.CRUD
  •  2. springmvc的文件上传
  • 3.文件上传三要素
  • 4.代码
    •  以上就是今天要讲的CRUD和文件上传下载,谢谢赏读!!!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档