myBatis + SpringMVC上传、下载文件
环境:maven+SpringMVC + Spring + MyBatis + MySql
本文主要说明如何使用input上传文件到服务器指定目录,或保存到数据库中;如何从数据库下载文件,和显示图像文件并实现缩放。
将文件存储在数据库中,一般是存文件的byte数组,对应的数据库数据类型为blob。
首先要创建数据库,此处使用MySql数据库。
注意:文中给出的代码多为节选重要片段,并不齐全。
1. 前期准备
使用maven创建一个springMVC+spring+mybatis+mysql的项目。
关于如何整合Spring+mybatis+mysql,请见MyBatis简介与配置MyBatis+Spring+MySql:
关于SpringMVC环境的搭建请见:使用Eclipse构建Maven的SpringMVC项目:
在前台html中,form的enctype为multipart/form-data。注意input、select的name要和StudentForm中成员一一对应。
上传的url为addAction.do,此action方法的参数中使用StudentForm来映射提交的数据。此时就可以获取到提交的文件的数据。然后我们就对文件进行操作。
创建PHOTO_TBL表:PHOTO_DATA字段用于存放文件,类型为MyBatis的longblob;然后写Mapper的Java接口PhotoMapper:包括增删改查;mapper的xml文件:对应JAVA接口的sql语句。
并且需要Spring配置文件添加一个bean的声明。
下面给出html、action、StudentForm的代码片段;创建PHOTO_TBL表的sql、PhotoMapper.java接口代码、PhotoMapper.xml文件代码。
1.1 html的form表单写法
<form action="<c:url value='addAction.do' />" method="post" enctype="multipart/form-data">
<table>
<tr>
<td width="100" align="right">照片:</td>
<td><input type="file" name="studentPhoto"/></td>
</tr>
</table>
<input type="submit">
</form>
1.2 action方法
/**
* 新增 - 提交
*/
@RequestMapping(value = "addAction.do")
public String add_action(ModelMap model, StudentForm form) {
}
1.3 StudentForm类
package liming.student.manager.web.model;
import org.springframework.web.multipart.MultipartFile;
public class StudentForm extends GeneralForm {
private String studentName;
private int studentSex;
private String studentBirthday;
private MultipartFile studentPhoto;
}
1.4 创建PHOTO_TBL
CREATE TABLE PHOTO_TBL
(
PHOTO_ID VARCHAR(100) PRIMARY KEY,
PHOTO_DATA LONGBLOB,
FILE_NAME VARCHAR(10)
);
1.5 PhotoMapper接口
@Repository
@Transactional
public interface PhotoMapper {
public void createPhoto(PhotoEntity entity);
public int deletePhotoByPhotoId(String photoId);
public int updatePhotoDate(@Param("photoId") String photoId, @Param("photoDate") byte[] photoDate);
public PhotoEntity getPhotoEntityByPhotoId(String photoId);
}
1.6 PhotoMapper.xml文件
包括增、删、改、查。其中新增中的photoId使用的是mysql自定义函数自动生成主键。在操作blob时需要制定typeHandler为"org.apache.ibatis.type.BlobTypeHandler。insert、update时参数后面需要指定,resultMap中需要指定。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="liming.student.manager.data.PhotoMapper">
<resultMap type="liming.student.manager.data.model.PhotoEntity" id="photoMapper_resultMap_photoEntity">
<id property="photoId" column="PHOTO_ID" javaType="String" jdbcType="VARCHAR" />
<result property="photoData" column="PHOTO_DATA" javaType="byte[]" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler" />
<result property="fileName" column="FILE_NAME" javaType="String" jdbcType="VARCHAR" />
</resultMap>
<insert id="createPhoto" parameterType="liming.student.manager.data.model.PhotoEntity">
<selectKey keyProperty="photoId" resultType="String" order="BEFORE">
select nextval('photo')
</selectKey>
INSERT INTO PHOTO_TBL(PHOTO_ID,
PHOTO_DATA,
FILE_NAME)
VALUES(#{photoId, jdbcType=VARCHAR},
#{photoData, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},
#{fileName, jdbcType=VARCHAR})
</insert>
<delete id="deletePhotoByPhotoId">
DELETE FROM PHOTO_TBL
WHERE PHOTO_ID = #{photoId, jdbcType=VARCHAR}
</delete>
<update id="updatephotoData" >
UPDATE PHOTO_TBL
SET PHOTO_DATA = #{photoData, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},
FILE_NAME = #{fileName, jdbcType=VARCHAR}
WHERE PHOTO_ID = #{photoId, jdbcType=VARCHAR}
</update>
<select id="getPhotoEntityByPhotoId" resultMap="photoMapper_resultMap_photoEntity">
SELECT PHOTO_ID,
PHOTO_DATA,
FILE_NAME
FROM PHOTO_TBL
WHERE PHOTO_ID = #{photoId, jdbcType=VARCHAR}
</select>
</mapper>
1.7 spring配置文件
需要Spring配置文件添加一个org.springframework.web.multipart.commons.CommonsMultipartResolver的bean的声明。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1073741824" />
</bean>
2. 将文件到服务器上
private static final String uploadFilePath = "d:\\temp_upload_file\\";
/**
* 新增 - 提交 – 只保存文件到服务器上
*/
@RequestMapping(value = "addAction.do")
public String add_action(ModelMap model, StudentForm form) {
try {
MultipartFile uploadFile = form.getStudentPhoto();
String filename = uploadFile.getOriginalFilename();
InputStream is = uploadFile.getInputStream();
// 如果服务器已经存在和上传文件同名的文件,则输出提示信息
File tempFile = new File(uploadFilePath + filename);
if (tempFile.exists()) {
boolean delResult = tempFile.delete();
System.out.println("删除已存在的文件:" + delResult);
}
// 开始保存文件到服务器
if (!filename.equals("")) {
FileOutputStream fos = new FileOutputStream(uploadFilePath + filename);
byte[] buffer = new byte[8192]; // 每次读8K字节
int count = 0;
// 开始读取上传文件的字节,并将其输出到服务端的上传文件输出流中
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count); // 向服务端文件写入字节流
}
fos.close(); // 关闭FileOutputStream对象
is.close(); // InputStream对象
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
3. 将文件上传到数据库中
/**
* 新增 - 提交 – 保存文件到数据库
*/
@RequestMapping(value = "addAction.do")
public String add_action(ModelMap model, StudentForm form) {
InputStream is = form.getStudentPhoto().getInputStream();
byte[] studentPhotoData = new byte[(int) form.getStudentPhoto().getSize()];
is.read(studentPhotoData);
String fileName = form.getStudentPhoto().getOriginalFilename();
PhotoEntity photoEntity = new PhotoEntity();
photoEntity.setPhotoData(studentPhotoData);
photoEntity.setFileName(fileName);
this.photoMapper.createPhoto(photoEntity);
}
4.下载文件
下载文件需要将byte数组还原成文件。
首先使用mybatis将数据库中的byte数组查出来,指定文件名(包括格式)。然后使用OutputStream将文件输入
@RequestMapping(value = "downPhotoById")
public void downPhotoByStudentId(String id, final HttpServletResponse response){
PhotoEntity entity = this.photoMapper.getPhotoEntityByPhotoId(id);
byte[] data = entity.getPhotoData();
String fileName = entity.getFileName()== null ? "照片.png" : entity.getFileName();
fileName = URLEncoder.encode(fileName, "UTF-8");
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
response.addHeader("Content-Length", "" + data.length);
response.setContentType("application/octet-stream;charset=UTF-8");
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
outputStream.write(data);
outputStream.flush();
outputStream.close();
}
<a href="<%=request.getContextPath() %>/downPhotoById.do?id=8000001">下载照片</a>
5. 显示byte图片文件
@RequestMapping(value = "getPhotoById")
public void getPhotoById (String id, final HttpServletResponse response){
PhotoEntity entity = this.photoMapper.getPhotoEntityByPhotoId(id);
byte[] data = entity.getPhotoData();
response.setContentType("image/jpeg");
response.setCharacterEncoding("UTF-8");
OutputStream outputSream = response.getOutputStream();
InputStream in = new ByteArrayInputStream(data);
int len = 0;
byte[] buf = new byte[1024];
while ((len = in.read(buf, 0, 1024)) != -1) {
outputSream.write(buf, 0, len);
}
outputSream.close();
}
<img src="<%=request.getContextPath() %>/getPhotoById.do?id=8000001"/>
6. 按长宽等比例缩放图片
@RequestMapping(value = "getPhotoId")
public void getPhotoById (String id, int width, int height, final HttpServletResponse response){
PhotoEntity entity = this.photoMapper.getPhotoEntityByPhotoId(id);
byte[] data = entity.getPhotoData();
if (width != 0 && height != 0) {
data = scaleImage(data, width, height);
}
response.setContentType("image/jpeg");
response.setCharacterEncoding("UTF-8");
OutputStream outputSream = response.getOutputStream();
InputStream in = new ByteArrayInputStream(data);
int len = 0;
byte[] buf = new byte[1024];
while ((len = in.read(buf, 0, 1024)) != -1) {
outputSream.write(buf, 0, len);
}
outputSream.close();
}
public static byte[] scaleImage(byte[] data, int width, int height) throws IOException {
BufferedImage buffered_oldImage = ImageIO.read(new ByteArrayInputStream(data));
int imageOldWidth = buffered_oldImage.getWidth();
int imageOldHeight = buffered_oldImage.getHeight();
double scale_x = (double) width / imageOldWidth;
double scale_y = (double) height / imageOldHeight;
double scale_xy = Math.min(scale_x, scale_y);
int imageNewWidth = (int) (imageOldWidth * scale_xy);
int imageNewHeight = (int) (imageOldHeight * scale_xy);
BufferedImage buffered_newImage = new BufferedImage(imageNewWidth, imageNewHeight, BufferedImage.TYPE_INT_RGB);
buffered_newImage.getGraphics().drawImage(buffered_oldImage.getScaledInstance(imageNewWidth, imageNewHeight, BufferedImage.SCALE_SMOOTH), 0, 0, null);
buffered_newImage.getGraphics().dispose();
ByteArrayOutputStream outPutStream = new ByteArrayOutputStream();
ImageIO.write(buffered_newImage, "jpeg", outPutStream);
return outPutStream.toByteArray();
}
<img src="<%=request.getContextPath() %>/getPhotoById.do?id=8000001&width=300&height=300"/>
分享到:
相关推荐
项目描述 说明: spring security 全注解式的权限管理 动态配置权限,角色和资源,权限控制到...Springboot+Mybatis+ SpringMvc+springsecrity+Redis+bootstrap+jquery 数据库文件 压缩包内 jar包文件 maven搭建
运行环境 jdk8+oracle+redis+IntelliJ IDEA+maven 项目技术(必填) Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis 数据库文件 压缩包内 jar包文件 maven搭建 Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业...
同时,还需要配置Spring和Mybatis的配置文件,以及SpringMVC的DispatcherServlet配置,确保各个组件能够协同工作。 总之,这个项目展示了如何综合运用多种技术构建一个完整的Web应用,对于初学者来说,这是一个很好...
【标题】"spring+springMVC+myBatis+maven项目整合"是一个常见的Java Web开发技术栈,这个项目集成了Spring框架(用于依赖注入和管理)、SpringMVC(用于处理HTTP请求和视图渲染)、MyBatis(作为持久层框架)以及...
Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理系统Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理系统Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理...
本文将详细介绍如何将MyBatis与SpringMVC整合,以实现一个完整的增删改查(CRUD)应用,并涉及所需的库文件。 MyBatis是一个优秀的SQL映射框架,它允许开发者直接编写SQL语句,将数据库操作与业务逻辑解耦。而...
在这个整合包中,我们还将探讨如何结合Bootstrap来实现前端界面的快速开发,并学习文件上传与下载的功能。 1. **Spring框架**:Spring是Java企业级应用的核心框架,它提供了依赖注入(DI)和面向切面编程(AOP)等...
框架是Spring+SpringMvc+Mybatis+maven+redis。前端是妹子UI。 里面的功能包括: 1、权限管理,可动态加载3级菜单,利用ztree 加载权限,可进行修改。 2、文件管理,客户端上传文件到服务器,服务器将文件上传到ftp...
校社联社团管理系统(Spring MVC+Spring+Mybatis+Redis),用来记录进度,和保存文件,完成一定阶段都上传到小组仓库中。 校社联社团管理系统(Spring MVC+Spring+Mybatis+Redis),用来记录进度,和保存文件,完成...
需要修改“root.dir”属性,设置为系统上传文件时用来存放的根目录 ----系统管理员用户名为:admin;密码为:123456 ----linux类系统需要修改mysql的配置文件,改为数据库表名不区分大小写(lower_case_...
【标题】中的"Spring+SpringMVC+Mybatis+Shiro+Hibernate验证+JSON+JSTL、EL+文件上传io jar包"涉及到的是一个经典的Java Web开发技术栈,通常用于构建企业级应用程序。下面将详细介绍这些技术及其在项目中的作用:...
该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载...
标题 "spring+springmvc+mybatis+shiro+freemarker+dubbo" 涵盖的是一个基于Java的完整Web应用程序开发框架。这个框架结合了Spring、SpringMVC、MyBatis、Shiro、FreeMarker以及Dubbo的核心技术,用于构建高效、可...
综上所述,这个"spring+springMVC+mybatis内容管理系统"结合了后端强大的SSM框架和前端美观的Layui,以及功能丰富的UEditor编辑器,实现了新闻展示和内容管理的高效、便捷。通过这些技术的整合,开发者可以快速构建...
它提供了强大的数据绑定、验证和文件上传功能,并且可以与其他Spring组件无缝集成,如Spring Security和Spring Data。 MyBatis是一个持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的...
以MySQL为数据库,在Spring Boot + SpringMVC + MyBatis + Layui框架下基于B/S架构设计开发而成。 文件夹介绍: database中存放的是sql文件 dormitory中存放的是后端代码 dormitoryfront中存放的是前端代码 excel...
3. 文档管理:提供上传、下载、共享文档的功能,可以使用Mybatis进行数据存储和检索。 4. 通知公告:发布和接收公司内部的通知,SpringMVC可以处理HTTP请求和响应,展示在前端页面上。 5. 系统集成:与其他系统(如...
在本项目中,我们主要探讨的是一个基于Spring、SpringMVC和Mybatis的整合应用案例,搭配MySQL数据库,实现了一些常见的功能,如文件上传下载和拦截器机制。这个案例是开发者自我测试和学习的一种实践,同时也可供...
《基于Spring+SpringMVC+MyBatis框架的网上商城管理系统》 在现代软件开发领域,Web应用的架构设计显得尤为重要。本项目采用了一个经典的Java技术栈——Spring、SpringMVC和MyBatis,构建了一个功能完善的网上商城...