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设计模式笔记之抽象工厂代码示例