springMVC+Mybatis实现图片上传、保存到数据库、查询显示——入坑实践
1、前提环境
1.1、前言
本篇文章建立在您已经有一个SpringMVC的+Mybatis的环境,也就是常说的你已经可以访问helloWord了。比如:
- 连接数据库的jdbc.properties,用来设置用户名和密码
- mybatis-config.xml配置文件,设置驼峰命名别名等(不必要哈)
- spring-mvc.xml,MVC的配置文件,很重要,关于文件上传的配置也在里面,后面会说道
但是并没有涉及到如何详细搭建该环境,因为本人是在某个SSM小项目的基础上践行的,环境相对而言只会提相关重要的,所以这点还请抱歉,如果有需要可以留言交流,我会尽快还早整理所需哦!
1.2 所需环境
1.2.1 数据库表(不需要也行,相当于数据库里面就没有嘛!)
就两个字段,自增id和path路径,这里的path是我在本地保存图片的绝对路径,之后会详细说道
1.2.2 pom.xml文件需要的架包
<!-- 文件上传的夹包 ,用于文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
1.2.3 spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- 配置SpringMVC -->
<!-- 1.开启SpringMVC注解模式 -->
<!-- 简化配置:
(1)自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter
(2)提供一些列:数据绑定,数字和日期的format @NumberFormat, @DateTimeFormat, xml,json默认读写支持
-->
<mvc:annotation-driven />
<!-- 2.静态资源默认servlet配置
(1)加入对静态资源的处理:js,gif,png
(2)允许使用"/"做整体映射
-->
<mvc:default-servlet-handler/>
<!-- 3.配置jsp 显示ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 4.扫描web相关的bean -->
<context:component-scan base-package="sicnu.WeatherService.controller" />
<!-- 对文件上传的处理,这里声明的id必须为multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
<!-- 最大为100M,单位为字节 -->
<property name="maxUploadSize" value="104857600"></property>
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxInMemorySize" value="40960"></property>
</bean>
</beans>
2、实体类和自动生成的mapper文件
- 实体类就是数据库Picture类,就两个属性测试就够了
- mapper文件不用工具生成的也行,用注解的方式在接口中的方法上添加@Select标签写SQL语句也行
3、简单页面
这里的form必须写enctype=“multipart/form-data”,不然是无法完成上传功能的
<form id="upload" action="up" method="post" enctype="multipart/form-data">
头像:<input id="file" type="file" name="image">
描述:<input type="text" name="desc" value="上传">
<input type="submit" value="上传文件">
</form>
显示所有图片的页面success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
上传成功,后面只是为了显示图片没有做太多控制
<p>
<c:forEach var="image" items="${imageList}">
<a href="images/${image}" rel="external nofollow" target="_blank"><img src="images/${image}" /></a>
</c:forEach>
</p>
</body>
</html>
4、在下图位置添加一个images文件夹
该文件夹就是用来存放上传的图片的。
5、Controller类
感觉说了很多无用的哈,之所以之前有些代码不粘贴出来,是因为对每个人情况不一样,所以只是说个大致。如果你还没有搭建好框架,也没有必要着急弄这个嘛。其实搭好框架就轻车熟路了,我在代码里尽量写了思路和语句的含义。
UploadImagesController.java
package sicnu.WeatherService.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import sicnu.WeatherService.entity.Picture;
import sicnu.WeatherService.mapper.PictureDao;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Controller
public class UploadImagesController {
//自动装配
@Autowired
PictureDao pictureDao;
//对于页面上form的action地址,注意我的up方法的参数添加了@RequestParam("desc")注解,
// 如果没有这个注解可能是不会成功的,可以下来试试,
// 还有MultipartFile实际上就是那个引入的架包,一个封装对象,有一些方法可以方便获取图片的信息
// 欢迎留言交流
@RequestMapping(value = "/up",method = RequestMethod.POST)
public String up(@RequestParam("desc") String desc ,@RequestParam("image") MultipartFile uploadFile, HttpSession session) throws IOException {
//获取上传文件的名称
String fileName = uploadFile.getOriginalFilename();
//构建path
String path = session.getServletContext().getRealPath("images") + File.separator + fileName;
//获取输入流
InputStream is = uploadFile.getInputStream();
//获取输出流
File file = new File(path);
OutputStream os = new FileOutputStream(file);
System.out.println("path:" + path + "fileName:" + fileName);
/*
这个代码也行,就是会慢点
int i = 0;
while((i = is.read()) != -1){
os.write(i);
}*/
int i = 0;
byte[] b = new byte[1024];
while((i = is.read(b)) != -1) {
os.write(b, 0, i);
}
os.close();
is.close();
Picture picture = new Picture();
picture.setPath(path);
//下面就相当于插入语句
Integer integer = pictureDao.insertPicture(picture);
//查看一下返回值,为1就是成功了
System.out.println("插入成功:?" + integer);
//重定向到images请求,即下一个方法
return "redirect:/images";
}
//显示所有图片
@RequestMapping(value="/images",method=RequestMethod.GET)
public ModelAndView showImages(HttpServletRequest request, HttpServletResponse response)
{
//根据相对路径获取绝对路径,图片上传后位于元数据中
List<String> rawImagesList=new ArrayList<String>();
//查询数据中所有的图片
List<Picture> pictureList = pictureDao.findPictures(new HashMap<String, Object>());
System.out.println("pictureList:" + pictureList.size());
for (Picture picture : pictureList){
//因为页面上只需要images/xx就行了,这个54你可能要改,因为我们路径可能不一样,取到images那个文件夹开始就行了
String subString = picture.getPath().substring(54);
System.out.println("subString:" + subString);
rawImagesList.add(subString);
}
ModelAndView mv=new ModelAndView();
mv.addObject("imageList", rawImagesList);
mv.setViewName("success");
return mv;
}
}
6、最后配上效果图
上传图片
上传后进行跳转,因为图片太大,没有控制,所以,哎呀,只是为了测试嘛体谅!!
可能文章不能顾及所有的伙伴们,若有需求或者哪里未能说明白,希望留言讨论,共同学习!