SpringMVC实现文件的上传和下载
相对于JavaWeb阶段我们使用过servlet实现文件上传和下载操作;而SpringMVC实现了对上传操作的直接支持,提供了multipart
解析器。MultipartFile
提供了一些对文件操作的方法,使得文件上传变得更简单。无论上传还是下载都是进行二进制流的转换,下面我们以案例的形式了解一下如何使用SpringMVC实现文件的上传操作。
文件上传
准备
了解
- 文件上传我们首先要考虑的就是把文件上传到哪里?是上传到工程目录下,还是上传到本地磁盘中?
- 因为上传的文件一般都是二进制文件,所以我们需要通过某种方式对表单提交进行编码。通过将
enctype
设置为multipart/form-data
,每个输入域都将作为POST请求的不同部分进行提交(默认提交的表单中数据存储格式是名字-值
,显然是不适合类似文件上传那种二进制数据的)。 - Spring提供了对
multipart
数据的解析器CommonsMultipartResolver
(MultipartResolver
接口的实现类),但是这个解析器是基于Apache Commons FileUpload
技术的,所以需要commons-filrUpload.jar
支持。
配置
除了我们之前使用的Spring以及SpringMVC的先关jar依赖包,还需要导入以下jar文件:
<!--文件上传下载-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
在springmvc.xml中配置上传下载解析器
<!--上传下载解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="10485760"></property> <!--设置最大支持的上传文件大小 B-->
</bean>
前台代码示例:
后台代码示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@RequestMapping("/insertMovie") @ResponseBody public Map<String,String> insertMovie(@RequestParam(value="file",required = false) MultipartFile file, Movie movie, HttpServletRequest request ){ Map<String,String> ret = new HashMap<String,String>(); Movie movie1 = movieServices.selectMovieByName(movie.getMovieCname()); if (movie1!=null){ ret.put("type","error"); ret.put("msg","电影已经存在,请勿二次添加"); return ret; } if (movie.getMovieDetail().length()>255){ ret.put("type","error"); ret.put("msg","电影详情文字过长,请简要说明"); return ret; } if(file.getSize()>10485760){ ret.put("type","error"); ret.put("msg","文件大小不得大于10M"); return ret; } String oldName = file.getOriginalFilename(); String type = oldName.substring(oldName.lastIndexOf(".")+1,oldName.length()); if (!"jpg,jpeg,gif,png".toUpperCase().contains(type.toUpperCase())){ ret.put("type","error"); ret.put("msg","请添加包含jpg,jpeg,gif,pang为后缀的图片"); return ret; } //上传图片要存储的路径,电影海报路径为movies/电影名字/picture/图片 String path = request.getSession().getServletContext().getRealPath("static/static/movies/"+movie.getMovieCname()+"/picture/"); File target = new File(path); if (!target.exists()){ target.mkdirs(); } String newName = System.currentTimeMillis()+"."+type; try { file.transferTo(new File(target,newName)); } catch (IOException e) { e.printStackTrace(); ret.put("type","error"); ret.put("msg","文件保存异常"); return ret; } //电影海报的项目绝对路径 movie.setMoviePicture("static/static/movies/"+movie.getMovieCname()+"/picture/"+newName); //默认添加时,将电影状态设置为1,代表热映 movie.setMovieState(1); int i = movieServices.insertMovie(movie); if (i<0){ ret.put("type","error"); ret.put("msg","添加失败"); return ret; } ret.put("type","success"); ret.put("msg","添加成功"); return ret; }
文件上传路径在tomcat目录下,不在当前目录下?
这是一个坑,明明代码都一样,人家的在target目录里面就能找到上传的文件,为什么我的就没有?
后来通过打印路径,发现我上传的文件跑到Tomcat的目录那里了。
但是,我就是想让上传的文件跑到当前项目的target目录下。
解决办法就是设置项目的部署方式为war exploded,如下图:
本段参考链接:https://blog.csdn.net/Deep_rooted/article/details/103838696