springMVC+Mybatis实现图片上传、保存到数据库、查询显示——入坑实践

9 篇文章 0 订阅
1 篇文章 0 订阅

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、最后配上效果图

上传图片
在这里插入图片描述上传后进行跳转,因为图片太大,没有控制,所以,哎呀,只是为了测试嘛体谅!!
在这里插入图片描述可能文章不能顾及所有的伙伴们,若有需求或者哪里未能说明白,希望留言讨论,共同学习!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值