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

 更新时间:2017年10月30日 11:07:51   作者:填空之城  
文件上传是大家应该都不陌生的一个功能,最近在开发中就又遇到了这个需求,所以想着总结一下方便以后需要的时候参考,下面这篇文章主要给大家介绍了关于Spring MVC环境中文件上传功能的实现方法,需要的朋友可以参考借鉴,下面来一起看看吧。

前言

     我们在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像、商品图片、邮件附件等等。其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上传和下载有或多或少的封装,这里就以Spring MVC环境中文件的上传为例,讲解Spirng MVC环境下的文件上传功能实现。下面话不多说了,来一起看看详细的介绍吧。

一、客户端编程

      由于多数文件上传都是通过表单形式提交给后台服务器的,因此,要实现文件上传功能,就需要提供一个文件上传的表单。同时该表单必须满足以下3个条件:

  • form表单的method属性设置为post;
  • form表单的enctype属性设置为multipart/form-data
  • 提供<input type="file" name="fileName" />的文件上传输入框。

在HTML5之前,如果想要上传多个文件,必须使用多个<input>元素。但是在HTML5中,在<input>元素配置multiple属性即可进行多个文件的上传。在HTML5中编写以下任意一行代码,便可生成一个按钮供选择多个文件:

  • <input type="file" name="fileName" multiple />
  • <input type="file" name="images" multiple="multiple" />
  • <input type="file" name="images" multiple="" />

具体代码示例如下:

<form action="uploadUrl" method="post" enctype="multipart/form-data">
 <input type="file" name="images" multiple="multiple" />
 <input type="submit" value="文件上传" />
</form>

二、springmvc-config.xml配置文件配置

      当客户端form表单的enctype属性为multipart/form-data时,浏览器就会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP请求。Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。

在Sring MVC中使用MultipartResolver也非常简单,只需要在Spring MVC配置文件springmvc-config.xml中定义MultipartResolver接口实现类即可,示例如下:

<!-- 配置文件上传类型解析器 multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 <!-- 设置上传文件最大尺寸,单位为B -->
 <property name="maxUploadSize" value="5242880" />
</bean>

注意:

由于MultipartResolver实现类CommonsMultipartResolver内部是引用multipartResolver字符串获取该实现类对象并完成文件上传操作的,所以在配置CommonsMultipartResolver时必须指定该bean的id为multipartResolver。另外由于MultipartResolver实现类CommonsMultipartResolver是Spring MVC内部通过Apache Commons FileUpload技术实现的。因此Spirng MVC的文件上传还需要依赖Apache Commons FileUpload的组件,即需要导入支持文件上传和下载的JAR包,具体如下:

  •  commons-fileupload.jar
  •  commons-io.jar

三、后台文件下载实现(MultipartFile接口介绍)

当完成上述客户端代码的编写及文件上传组件的配置后,在Spring MVC中处理已经上传的文件就十分容易了,上传到Spring MVC程序中的文件会被封装到一个MultipartFile对象中,然后开发者通过该对象的方法就可以进行后续相关处理了。

编写后台文件上传控制器类及方法,具体示例如下:

/**
 * 向文件上传页面跳转
 */
@RequestMapping("/toFileUpload")
public String toFileUpload( ){
 return "fileUpload";
}
/**
 * 接收文件上传请求
 */
@RequestMapping("/fileUpload")
public String fileUpload(List<MultipartFile> images){
 //对上传图像进行解析操作
 if(images !=null && images.size()>0){
  for (MultipartFile image : images) {
   //获取上传文件的原始名称
   String originalFilename = image.getOriginalFilename();
   //设置上传文件的保存地址目录
   String dirPath="D:\\fileUpload\\";
   File file =new File(dirPath);
   //如果保存文件的地址不存在,就先创建目录
   if(!file.exists()){
    file.mkdirs();
   }
   //使用UUID重新命名上传的文件名称(看公司需求,也可以用日期时间)
   String newFilename= UUID.randomUUID()+originalFilename.substring(originalFilename.lastIndexOf("."));
   try {
    //使用MultipartFile接口的方法完成文件上传到指定位置
    image.transferTo(new File(dirPath+newFilename));
    //文件上传成功后,需要将文件存放路径存入数据库中
    //TODO,省略
   } catch (Exception e) {
    e.printStackTrace();
    //当文件上传出现异常,则重定向到文件上传页面
    return "redirect:toFileUpload";
   } 
  }
 }
 //文件上传成功后,跳转到成功页面
 return "success";
}

四、效果演示(读者可以自己编写项目和jsp页面)

部署并启动web服务器,在浏览器地址啦输入地址:http://localhost:8080/webname/toFileUpload后(读者根据自己的项目和路径进行访问),浏览器的显示效果如下图所示。

上面我选择了上传2个文件,然后点击提交后,即可完成上传。读者操作后可自行到指定上传位置进行验证。

至此,Sring MVC环境下文件上传功能代码即已实现。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • java字符串压缩解压示例

    java字符串压缩解压示例

    这篇文章主要介绍了java字符串压缩解压示例,先压缩,再加密,再压缩,数据越大,压缩比例越高,需要的朋友可以参考下
    2014-03-03
  • java实现Spring在XML配置java类的方法

    java实现Spring在XML配置java类的方法

    下面小编就为大家带来一篇java实现Spring在XML配置java类的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Springboot 1.5.7整合Kafka-client代码示例

    Springboot 1.5.7整合Kafka-client代码示例

    这篇文章主要介绍了Springboot 1.5.7整合Kafka-client代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java获取七牛云存储空间中图片外链

    Java获取七牛云存储空间中图片外链

    本文主要介绍了Java获取七牛云存储空间中图片外链,需要获取在七牛云中存储的所有图片,并返回外链地址,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Java完全二叉树的创建与四种遍历方法分析

    Java完全二叉树的创建与四种遍历方法分析

    这篇文章主要介绍了Java完全二叉树的创建与四种遍历方法,结合实例形式分析了完全二叉树的概念、定义及遍历操作相关实现技巧,并对比分析了满二叉树与完全二叉树的区别,需要的朋友可以参考下
    2017-11-11
  • MyBatis使用resultMap如何解决列名和属性名不一致

    MyBatis使用resultMap如何解决列名和属性名不一致

    这篇文章主要介绍了MyBatis使用resultMap如何解决列名和属性名不一致的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 关于RestTemplate的使用深度解析

    关于RestTemplate的使用深度解析

    这篇文章主要介绍了对RestTemplate的深度解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • spring结合redis如何实现数据的缓存

    spring结合redis如何实现数据的缓存

    这篇文章主要介绍了spring结合redis如何实现数据的缓存,实现的目的目的不是加快查询的速度,而是减少数据库的负担,需要的朋友可以参考下
    2015-12-12
  • springboot简单实现单点登录的示例代码

    springboot简单实现单点登录的示例代码

    本文主要介绍了springboot简单实现单点登录的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • java服务器的简单实现过程记录

    java服务器的简单实现过程记录

    在线浏览网页离不开服务器,用户发出请求request,服务器做出响应response,提供给用户需要的页面,这篇文章主要给大家介绍了关于java服务器简单实现的相关资料,需要的朋友可以参考下
    2021-11-11

最新评论