目录
CRUD是4个单词的首字母,CRUD分别指增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)这4个单词的首字母。
2.1 添加文件上传相关依赖
2.2 配置文件上传解析器(CommonsMultipartResolver)
2.3 表单提交方式为method="post" enctype="multipart/form-data"
2.4 文件项用spring提供的MultipartFile进行接收
2.5 上传文件
2.6 下载文件
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.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);
}
(1)表单的提交方式必须是POST请求 (2)表单中必须有一个文件上传项:<input type=“file” name=“upload”/>,文件上传项必须有name属性和值; (3)表单的enctype属性的值必须是multipart/form-data
下面是数据库表:
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给大家做个示例,所以不要太纠结哈,功能能用就行哈!!!