MyBatis与SpringMVC相结合实现文件上传、下载功能

环境:maven+SpringMVC + Spring + MyBatis + MySql

本文主要说明如何使用input上传文件到服务器指定目录,或保存到数据库中;如何从数据库下载文件,和显示图像文件并实现缩放。

将文件存储在数据库中,一般是存文件的byte数组,对应的数据库数据类型为blob。

首先要创建数据库,此处使用MySql数据库。

注意:文中给出的代码多为节选重要片段,并不齐全。

1. 前期准备

使用maven创建一个springMVC+spring+mybatis+mysql的项目。

关于如何整合Spring+mybatis+mysql,请见MyBatis简介与配置MyBatis+Spring+MySql:

MyBatis学习 之 一、MyBatis简介与配置MyBaits+Spring+MySql

关于SpringMVC环境的搭建请见:使用Eclipse构建Maven的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表单写法

1.<form action="<c:url value='addAction.do' />" method="post" enctype="multipart/form-data">
2. <table>
3. <tr>
4. <td width="100" align="right">照片:</td>
5. <td><input type="file" name="studentPhoto"/></td>
6. </tr>
7. </table>
8. <input type="submit">
9.</form> 

1.2 action方法

1./**
2. * 新增 - 提交
3. */
4.@RequestMapping(value = "addAction.do")
5.public String add_action(ModelMap model, StudentForm form) {
6.
7.} 

1.3 StudentForm类

1.package liming.student.manager.web.model;
2.
3.import org.springframework.web.multipart.MultipartFile;
4.
5.public class StudentForm extends GeneralForm {
6.
7. private String studentName;
8. private int studentSex;
9. private String studentBirthday;
10. private MultipartFile studentPhoto;
11.
12.} 

1.4 创建PHOTO_TBL

1.CREATE TABLE PHOTO_TBL
2.(
3. PHOTO_ID VARCHAR(100) PRIMARY KEY,
4. PHOTO_DATA LONGBLOB,
5. FILE_NAME VARCHAR(10)
6.); 

1.5 PhotoMapper接口

1.@Repository
2.@Transactional
3.public interface PhotoMapper {
4.
5. public void createPhoto(PhotoEntity entity);
6.
7. public int deletePhotoByPhotoId(String photoId);
8.
9. public int updatePhotoDate(@Param("photoId") String photoId, @Param("photoDate") byte[] photoDate);
10.
11. public PhotoEntity getPhotoEntityByPhotoId(String photoId);
12.
13.} 

1.6 PhotoMapper.xml文件

包括增、删、改、查。其中新增中的photoId使用的是mysql自定义函数自动生成主键。在操作blob时需要制定typeHandler为"org.apache.ibatis.type.BlobTypeHandler。insert、update时参数后面需要指定,resultMap中需要指定。

1.<?xml version="1.0" encoding="UTF-8" ?>
2.<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3.<mapper namespace="liming.student.manager.data.PhotoMapper">
4. <resultMap type="liming.student.manager.data.model.PhotoEntity" id="photoMapper_resultMap_photoEntity">
5. <id property="photoId" column="PHOTO_ID" javaType="String" jdbcType="VARCHAR" />
6. <result property="photoData" column="PHOTO_DATA" javaType="byte[]" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler" />
7. <result property="fileName" column="FILE_NAME" javaType="String" jdbcType="VARCHAR" />
8. </resultMap>
9.
10. <insert id="createPhoto" parameterType="liming.student.manager.data.model.PhotoEntity">
11. <selectKey keyProperty="photoId" resultType="String" order="BEFORE">
12. select nextval('photo')
13. </selectKey>
14. INSERT INTO PHOTO_TBL(PHOTO_ID,
15. PHOTO_DATA,
16. FILE_NAME)
17. VALUES(#{photoId, jdbcType=VARCHAR},
18. #{photoData, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},
19. #{fileName, jdbcType=VARCHAR})
20. </insert>
21.
22. <delete id="deletePhotoByPhotoId">
23. DELETE FROM PHOTO_TBL
24. WHERE PHOTO_ID = #{photoId, jdbcType=VARCHAR}
25. </delete>
26.
27. <update id="updatephotoData" >
28. UPDATE PHOTO_TBL
29. SET PHOTO_DATA = #{photoData, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},
30. FILE_NAME = #{fileName, jdbcType=VARCHAR}
31. WHERE PHOTO_ID = #{photoId, jdbcType=VARCHAR}
32. </update>
33.
34. <select id="getPhotoEntityByPhotoId" resultMap="photoMapper_resultMap_photoEntity">
35. SELECT PHOTO_ID,
36. PHOTO_DATA,
37. FILE_NAME
38. FROM PHOTO_TBL
39. WHERE PHOTO_ID = #{photoId, jdbcType=VARCHAR}
40. </select>
41.</mapper> 

1.7 spring配置文件

需要Spring配置文件添加一个org.springframework.web.multipart.commons.CommonsMultipartResolver的bean的声明。

1.<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
2. <property name="maxUploadSize" value="1073741824" />
3.</bean> 

2. 将文件到服务器上

1.private static final String uploadFilePath = "d:\\temp_upload_file\\";
2.
3./**
4. * 新增 - 提交 – 只保存文件到服务器上
5. */
6.@RequestMapping(value = "addAction.do")
7.public String add_action(ModelMap model, StudentForm form) {
8.try {
9. MultipartFile uploadFile = form.getStudentPhoto();
10. String filename = uploadFile.getOriginalFilename();
11. InputStream is = uploadFile.getInputStream();
12. // 如果服务器已经存在和上传文件同名的文件,则输出提示信息
13. File tempFile = new File(uploadFilePath + filename);
14. if (tempFile.exists()) {
15. boolean delResult = tempFile.delete();
16. System.out.println("删除已存在的文件:" + delResult);
17. }
18. // 开始保存文件到服务器
19. if (!filename.equals("")) {
20. FileOutputStream fos = new FileOutputStream(uploadFilePath + filename);
21. byte[] buffer = new byte[8192]; // 每次读8K字节
22. int count = 0;
23. // 开始读取上传文件的字节,并将其输出到服务端的上传文件输出流中
24. while ((count = is.read(buffer)) > 0) {
25. fos.write(buffer, 0, count); // 向服务端文件写入字节流
26. }
27. fos.close(); // 关闭FileOutputStream对象
28. is.close(); // InputStream对象
29. }
30. } catch (FileNotFoundException e) {
31. e.printStackTrace();
32. } catch (IOException e) {
33. e.printStackTrace();
34. }
35.} 

3. 将文件上传到数据库中

1./**
2. * 新增 - 提交 – 保存文件到数据库
3. */
4.@RequestMapping(value = "addAction.do")
5.public String add_action(ModelMap model, StudentForm form) {
6. InputStream is = form.getStudentPhoto().getInputStream();
7. byte[] studentPhotoData = new byte[(int) form.getStudentPhoto().getSize()];
8. is.read(studentPhotoData);
9. String fileName = form.getStudentPhoto().getOriginalFilename();
10. PhotoEntity photoEntity = new PhotoEntity();
11. photoEntity.setPhotoData(studentPhotoData);
12. photoEntity.setFileName(fileName);
13. this.photoMapper.createPhoto(photoEntity);
14.} 

4.下载文件

下载文件需要将byte数组还原成文件。

首先使用mybatis将数据库中的byte数组查出来,指定文件名(包括格式)。然后使用OutputStream将文件输入

1.@RequestMapping(value = "downPhotoById")
2.public void downPhotoByStudentId(String id, final HttpServletResponse response){
3. PhotoEntity entity = this.photoMapper.getPhotoEntityByPhotoId(id);
4. byte[] data = entity.getPhotoData();
5. String fileName = entity.getFileName()== null ? "照片.png" : entity.getFileName();
6. fileName = URLEncoder.encode(fileName, "UTF-8");
7. response.reset();
8. response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
9. response.addHeader("Content-Length", "" + data.length);
10. response.setContentType("application/octet-stream;charset=UTF-8");
11. OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
12. outputStream.write(data);
13. outputStream.flush();
14. outputStream.close();
15.} 
<a href="<%=request.getContextPath() %>/downPhotoById.do?id=8000001">下载照片</a> 

5. 显示byte图片文件

1.@RequestMapping(value = "getPhotoById")
2.public void getPhotoById (String id, final HttpServletResponse response){
3. PhotoEntity entity = this.photoMapper.getPhotoEntityByPhotoId(id);
4. byte[] data = entity.getPhotoData();
5. response.setContentType("image/jpeg");
6. response.setCharacterEncoding("UTF-8");
7. OutputStream outputSream = response.getOutputStream();
8. InputStream in = new ByteArrayInputStream(data);
9. int len = 0;
10. byte[] buf = new byte[1024];
11. while ((len = in.read(buf, 0, 1024)) != -1) {
12. outputSream.write(buf, 0, len);
13. }
14. outputSream.close();
15.} 
<img src="<%=request.getContextPath() %>/getPhotoById.do?id=8000001"/> 

6. 按长宽等比例缩放图片

1.@RequestMapping(value = "getPhotoId")
2.public void getPhotoById (String id, int width, int height, final HttpServletResponse response){
3. PhotoEntity entity = this.photoMapper.getPhotoEntityByPhotoId(id);
4. byte[] data = entity.getPhotoData();
5. if (width != 0 && height != 0) {
6. data = scaleImage(data, width, height);
7. }
8. response.setContentType("image/jpeg");
9. response.setCharacterEncoding("UTF-8");
10. OutputStream outputSream = response.getOutputStream();
11. InputStream in = new ByteArrayInputStream(data);
12. int len = 0;
13. byte[] buf = new byte[1024];
14. while ((len = in.read(buf, 0, 1024)) != -1) {
15. outputSream.write(buf, 0, len);
16. }
17. outputSream.close();
18.}
19.
20.public static byte[] scaleImage(byte[] data, int width, int height) throws IOException {
21. BufferedImage buffered_oldImage = ImageIO.read(new ByteArrayInputStream(data));
22. int imageOldWidth = buffered_oldImage.getWidth();
23. int imageOldHeight = buffered_oldImage.getHeight();
24. double scale_x = (double) width / imageOldWidth;
25. double scale_y = (double) height / imageOldHeight;
26. double scale_xy = Math.min(scale_x, scale_y);
27. int imageNewWidth = (int) (imageOldWidth * scale_xy);
28. int imageNewHeight = (int) (imageOldHeight * scale_xy);
29. BufferedImage buffered_newImage = new BufferedImage(imageNewWidth, imageNewHeight, BufferedImage.TYPE_INT_RGB);
30. buffered_newImage.getGraphics().drawImage(buffered_oldImage.getScaledInstance(imageNewWidth, imageNewHeight, BufferedImage.SCALE_SMOOTH), 0, 0, null);
31. buffered_newImage.getGraphics().dispose();
32. ByteArrayOutputStream outPutStream = new ByteArrayOutputStream();
33. ImageIO.write(buffered_newImage, "jpeg", outPutStream);
34. return outPutStream.toByteArray();
35.} 
<img src="<%=request.getContextPath() %>/getPhotoById.do?id=8000001&width=300&height=300"/> 

以上所述是小编给大家介绍的MyBatis与SpringMVC相结合实现文件上传、下载功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

时间: 2016-06-21

springMVC结合AjaxForm上传文件

最近在项目中需要上传文件文件,之前一直都是form提交的,尝试了一下AjaxForm,感觉还比较好用,写篇随笔mark下,供以后使用. 准备工作: 下载jquery-form.js 相关jar: commons-fileupload-1.1.1.jar commons-io-1.3.2.jar 在spring-servlet.xml进行multipartResolver配置: <bean id="multipartResolver" class="org.springf

springMVC实现前台带进度条文件上传的示例代码

项目框架采用spring+hibernate+springMVC如果上传文件不想使用flash那么你可以采用HTML5;截图前段模块是bootstarp框架;不废话直接来代码;spring-mvc配置文件;效果截图如下: 详细实现如下: 1.mvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/s

SpringMVC文件上传的配置实例详解

记述一下步骤以备查. 准备工作: 需要把Jakarta Commons FileUpload及Jakarta Commons io的包放lib里. 我这边的包是: commons-fileupload-1.1.1.jar commons-io-1.3.2.jar 然后在spring-servlet.xml进行multipartResolver配置,不配置好上传会不好用. <bean id="multipartResolver" class="org.springfram

Spring MVC中上传文件实例

SpringMVC(注解)上传文件需要注意的几个地方: 1.form的enctype="multipart/form-data",这个是上传文件必须的 2.applicationContext.xml配置: 复制代码 代码如下: <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> <bean id="multipartResolver" class="org.springframework.w

SpringMVC文件上传 多文件上传实例

必须明确告诉DispatcherServlet如何处理MultipartRequest.SpringMVC中提供了文件上传使用方式如下配置xxx-servlet.xml,添加如下代码: 复制代码 代码如下: <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">          <!-- 设置

SpringMVC 文件上传配置,多文件上传,使用的MultipartFile的实例

基本的SpringMVC的搭建在我的上一篇文章里已经写过了,这篇文章主要说明一下如何使用SpringMVC进行表单上的文件上传以及多个文件同时上传的步骤 文件上传项目的源码下载地址:demo 一.配置文件: SpringMVC 用的是 的MultipartFile来进行文件上传 所以我们首先要配置MultipartResolver:用于处理表单中的file <!-- 配置MultipartResolver 用于文件上传 使用spring的CommosMultipartResolver -->

Java Spring MVC 上传下载文件配置及controller方法详解

下载: 1.在spring-mvc中配置(用于100M以下的文件下载) <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <!--配置下载返回类型--> <bean class="or

详解SpringMVC使用MultipartFile实现文件的上传

如果需要实现跨服务器上传文件,就是将我们本地的文件上传到资源服务器上,比较好的办法就是通过ftp上传.这里是结合SpringMVC+ftp的形式上传的.我们需要先懂得如何配置springMVC,然后在配置ftp,最后再结合MultipartFile上传文件. springMVC上传需要几个关键jar包,spring以及关联包可以自己配置,这里主要说明关键的jar包 1:spring-web-3.2.9.RELEASE.jar (spring的关键jar包,版本可以自己选择) 2:commons-

Spring MVC环境中文件上传功能的实现方法详解

前言 我们在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像.商品图片.邮件附件等等.其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上传和下载有或多或少的封装,这里就以Spring MVC环境中文件的上传为例,讲解Spirng MVC环境下的文件上传功能实现.下面话不多说了,来一起看看详细的介绍吧. 一.客户端编程 由于多数文件上传都是通过表单形式提交给后台服务器的,因此,要实现文件上传功能,就需要提供一个文件上传的表单

springMVC配置环境实现文件上传和下载

最近的项目中用到了文件的上传和下载功能,我觉着这个功能比较重要,因此特意把它提取出来自己进行了尝试. 下面就是springMVC配置环境实现文件上传和下载的具体步骤,供大家参考,具体内容如下 一. 基础配置: maven导包及配置pom.xml,导包时除开springmvc的基础依赖外,需要导入文件上传下载时用到的commons-io.jsr和commons-fileupload.jar: <project xmlns="http://maven.apache.org/POM/4.0.0&

SpringMvc MultipartFile实现图片文件上传示例

整理文档,搜刮出一个SpringMvc MultipartFile实现图片文件上传示例,稍微整理精简一下做下分享. spring-servlet.xml <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver&qu

springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项

在使用easyUI做前端样式展示时,遇到了文件上传的问题,而且是在弹出层中提交表单,想做到不刷新页面,所以选择了使用ajaxFileUpload插件.提交表单时一直发现后台接收不到文件,后检查发现,原来是文件的id不对. 文件上传框我们定义如下: <input class="easyui-filebox" id="image" name="image" data-options="label:'产品图片:',buttonText:

JavaWeb实现文件上传与下载实例详解

在Web应用程序开发中,文件上传与下载功能是非常常用的功能,下面通过本文给大家介绍JavaWeb实现文件上传与下载实例详解. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,common-fileupload是依赖于c

JAVA使用commos-fileupload实现文件上传与下载实例解析

首先给大家介绍一文件的上传 实体类 import java.sql.Timestamp; /** * * @Decription 文件上传实体类 * */ public class Upfile { private String id;// ID主键 使用uuid随机生成 private String uuidname; // UUID名称 private String filename;//文件名称 private String savepath; // 保存路径 private Timest

java组件commons-fileupload实现文件上传、下载、在线打开

最近做了一个文件上传.下载.与在线打开文件的功能,刚开始对文件上传的界面中含有其它表单(例如输入框.密码等)在上传的过程中遇到了许多问题,下面我写了一个同时实现文件上传.下载.在线打开文件的测试程序. 首先请看效果图: 核心代码: package com.jefry; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URL; import java.u

php文件上传及下载附带显示文件及目录功能

主页面wenjianceshi.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-

C#文件上传与下载的实现方法

本文实例为大家分享了C#实现文件上传与下载的具体代码,供大家参考,具体内容如下 C#实现文件上传代码: public ActionResult Upload() { // var pathUrl = "http://" + Request.Url.Authority; var file = Request.Files["Filedata"]; var uploadFileName = file.FileName; string filePath = "/F