SpringMVC+Spring+Mybatis三大框架整合实现文件上传

1 篇文章 0 订阅

最近两周学校组织了一个实训,其中有个文件上传的小功能,以下我来总结一下文件上传功能

SpringMVC实现文件的上传和下载

相对于JavaWeb阶段我们使用过servlet实现文件上传和下载操作;而SpringMVC实现了对上传操作的直接支持,提供了multipart解析器。MultipartFile提供了一些对文件操作的方法,使得文件上传变得更简单。无论上传还是下载都是进行二进制流的转换,下面我们以案例的形式了解一下如何使用SpringMVC实现文件的上传操作。

准备

了解
1.文件上传我们首先要考虑的就是把文件上传到哪里?是上传到工程目录下,还是上传到本地磁盘中?
2.因为上传的文件一般都是二进制文件,所以我们需要通过某种方式对表单提交进行编码。通过将enctype设置为multipart/form-data,每个输入域都将作为POST请求的不同部分进行提交(默认提交的表单中数据存储格式是名字-值,显然是不适合类似文件上传那种二进制数据的)。
3.Spring提供了对multipart数据的解析器CommonsMultipartResolver(MultipartResolver接口的实现类),但是这个解析器是基于Apache Commons FileUpload技术的,所以需要commons-filrUpload.jar支持。

配置

除了我们之前使用的Spring以及SpringMVC和Mybatis的相关关jar依赖包,还需要导入以下jar文件
这里写图片描述

实例

先看一下项目结构
这里写图片描述

因为图片上传后要保存图片的路径到数据库,达到回显示的效果,我将单独建了一张picture表,以下是表结构
图片表

图片上传的表单在userDetail.jsp中,让我们来看一下

注意:因为这是用户详情的JSP,之前有遍历过用户的信息,这里我将用户的id设置为隐藏域提交给表单,如果你们自己有自己的需求,请按自己的需求来提交

1.Controller层

//上传图片
    @RequestMapping(value="/savePicture.do",method = RequestMethod.POST)
    public String savePic(@RequestParam Integer id,@RequestParam Integer userId,
            @RequestParam(value="image",required=false)MultipartFile image,HttpServletRequest request,Model model) {
        //获取图片在服务器上的存储位置
        String path = request.getSession().getServletContext().getRealPath("/upload");
        File filePath = new File(path);
        System.out.println("文件保存的路径"+path);
        if(!filePath.exists()&&!filePath.isDirectory()) {

            System.out.println("图片目录不存在,创建图片路径"+filePath);
            filePath.mkdir();
        }

        //获取原始文件名称
        String originalFileName = image.getOriginalFilename();
        System.out.println("原始文件的名称"+originalFileName);

        //获取文件的类型,以“.”作为标识
        String type = originalFileName.substring(originalFileName.lastIndexOf(".")+1);
        System.out.println("文件类型"+type);

        //设置文件的新名字
        String fileName = System.currentTimeMillis()+"."+type;
        System.out.println("文件新名称"+fileName);


        //在指定的路径下面创建一个新的文件
        File targerFile = new File(path,fileName);


        //将文件保存到服务器的指定位置
        try {

            image.transferTo(targerFile);
            model.addAttribute("msg", "保存图片成功");
            pictureService.save(id,userId,"/upload/"+fileName);
            return "uploadsuccess";
        } catch (IllegalStateException | IOException e) {
            System.out.println("文件保存错误");
            e.printStackTrace();
        }


        return "uploaderror";



    }

图片上传主要代码在Controller层,接下来的就是调用Service将数据保存到数据库了,我们首先了解一下文件操作的API方法:
1.request.getSession().getServletContext().getRealPath(String s):获取本项目下指定目录的绝对路径。
2.MultipartFile.getOriginalFilename():获取被MultipartFile绑定的上传参数的原始名称
3.System.currentTimeMillis():获取自1970年1月1日0时起到现在时间的毫秒数。
4.MultipartFile.transferTo(): 在指定的磁盘路径下生成一个新的文件。

如果指定路径下的文件夹存在,就将上传的文件写入进这个文件夹中,如果此文件夹不存在,就调用mkdir()方法创建此文件夹。这里我将文件夹建立在我的本地Tomcat目录下的upload中,
这里写图片描述

最后我们要在SpringMvc中注册一个multipart解析器,这里我将图片上传大小限制在9M左右以内
这里写图片描述

上述内容准备完毕以后,我们直接调用pictureService的save方法来将表单数据保存到数据库中
PictureService接口代码

public interface PictureService {

    void save(Integer userId, Integer id, String image);

    Picture findAll(Integer id);

}

PictureServiceImpl实现类代码
@Service
@Transactional
public class PictureServiceImpl implements PictureService {
@Autowired
private PictureDao pictureDao;
public void save(Integer userId,Integer id, String image) {
pictureDao.save(userId,id,image);

}
@Override
public Picture findAll(Integer id) {

    return pictureDao.findAll(id);
}

}

PictureDao接口代码

public interface PictureDao {

void save(@Param("id")Integer id,@Param("userId")Integer userId,
        @Param("picName")String image);

Picture findAll(Integer id);

}

PictureDao.xml 代码,也就是mybatis插入数据的代码

<mapper namespace="com.tedu.wiot.mapper.PictureDao">

<insert id="save">
insert into friend_pic(id,userId,picName) values(#{id},#{userId},#{picName})

</insert>

<select id="findAll" resultType="Picture" parameterType="Integer">
 select * from friend_pic where id = #{id}
</select>


</mapper>

接下来我们启动Tomcat,访问图片上传的userDetail.jsp,来上传一张图片,图片上传成功后,跳转到uploadsuccess.jsp,我们点击return,回显图片.
这里写图片描述

看,果然是帅气的我

帅气的我

接下来我们查看数据库中是否保存数据成功
这里写图片描述
插入数据成功了。

因为我的数据回显,既要回显示这个用户的一些数据,也要回显图片的数据,这里我们来看一下回显的代码

    @RequestMapping(value="/userDetailAndPicturejsp.do")
    public String userDetailAndPicturejsp(Model model,@RequestParam("id")Integer id) {
        User user = userService.findUser(id);
        model.addAttribute("user",user);
        Picture picture = pictureService.findAll(id);
        model.addAttribute("picture",picture);
        return "userDetail";

    }

注意:这里我传的id是用户的id因为要回显,我事先把用户存入了Session域当中,这样才能在跳转到保存图片成功的JSP页面后保证能取到该用户ID的值。
这里写图片描述

保存图片成功跳转到uploadSuccess.jsp中,这里是这个JSP的主要代码,${msg}是我用EL表达式取出的保存图片成功或者失败存入的信息值.

<body>
${msg}
<h2>点击返回详情列表</h2>
点击返回详情列表
<a href="${pageContext.request.contextPath}/userDetailAndPicturejsp.do?id=${sessionScope.user.id}">return</a>
</body>

最后我们看控制台打印的图片信息
这里写图片描述

以上是我结合SSM三大框架整合的图片上传的一个小功能,欢迎大牛提出宝贵意见,以上仅供参考!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本项目是用的spring springMVC myBatis框架,前段没用框架,只写了简单的页面效果,做增删查改 这是我系统学习所得,希望能对你有所帮助 项目部署: 1;导包,就是web-inf下lib,让后把这些选中,单击右键build path -->add library 2;web.xml配置文件,这里几乎不需要改,以后要用只需要复制就行 3;具体框架配置文件,都集中在了sourceConfig文件夹下,这个自己琢磨,以后再用这个框架也是几乎不需要改的,之所以说几乎,是因为只需要改包名就可以了 4;写bean,写dao,写service,写controller,这是重点 5;bean下写要操作的数据表,记住这个类药与数据库中的表一致,最好一模一样,避免麻烦 6;dao下写数据库操作内容,那下面有两个文件名一样的,一个是java文件,一个是xml文件,java文件是定义方法名,xml文件是让你写具体的数据操作方法的,格式就是这样,你看看就能懂,你只需要这样写,这个框架就可以识别,吧你在xml中写的数据库操作方法匹配到java文件中的方法,这是mybatis做的事 7;service包中放你的业务逻辑层,具体来说就是,dao中只放数据操作,service引用数据操作,还可以有其他操作 8;controller类的格式你要用心点了,这个是控制器,控制请求的跳转,他和servlet的功能类似, 功能引导: 为了让你更方便了解这个项目,说一下流程 1.把项目部署到tomcat,启动服务, 2.在浏览器中输入http://localhost:8080/AscentSys/user/in.do 3.这个命令的意思是,访问这个项目地址user/in.do,然后这个请求就会发送到controller中,在controller中首先匹配到user,在匹配到in.do就调到具体的方法中去处理这个情求了,这里会跳转到users文件夹下的login.jsp页面中,解释一下,在spring-servlet.xml配置文件中有一句路径解析的,“前缀后缀”那个bean,意思是在返回的东西加前缀后缀,这里写的是啥你琢磨琢磨可以明白的 4.在login.jsp页面中,有个提交地址,是login.do,按上面说的,在controller中首先匹配到user,在匹配到login.do就调到具体的方法中去处理这个情求了,后面的流程我就不说了,自己看 5。再说一点,return的好多字符串,有的是redirect:/user/userlist.do这样的格式,意思是转发,就是转到另一个请求中去,同理,具体意思是,在controller中首先匹配到user,在匹配到userlist.do就调到下面的方法中去处理这个情求了, 6,关于传参数的问题,在表单中写的属性,在controller自动接收,也可以接受user对象,如果是对象,那个表单的格式你要看仔细了和一般表单的不同之处。琢磨琢磨你会明白的, 希望能对你有所帮助
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值