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三大框架整合的图片上传的一个小功能,欢迎大牛提出宝贵意见,以上仅供参考!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值