spring上传文件和参数后端接收
我要实现的功能是管理员添加一部电影,电影中含有海报、剧照两种文件类型以及其他电影相关信息,而海报只有一张,剧照可以上传很多张,添加成功后,文件将保存在本地,数据库会多出一条记录,在数据库中,海报剧照存储的是本地绝对路径。每个剧照url中间用空格隔开。
jar包。
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
配置文件springMVC.xml
<!--支持文件上传-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为50MB -->
<property name="maxUploadSize">
<value>52428800</value>
</property>
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
Movie类
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Movie {
private Integer movId;
private String movName;
private String movDescription;
private String movType;
private Integer movStatus;
private Integer movLastTime;
private String movDirector;
private Double movCore;
private Date movReleaseTime;
private String movActor;
private Integer movIsCome;
private Integer movIsHot;
private String movImage;
private String movPhotos;
private String movArea;
private Date creatTime;
private Date updateTime;
}
其中Lombok是一种Java实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。它通过注释实现这一目的。
GetFileUrl工具类(主要为了获取单一文件的路径)
public class GetFileUrl {
public static String get(MultipartFile file, String movName, HttpServletRequest request) throws IOException {
//创建文件保存在本地的根路径
String rootpath = request.getServletContext().getRealPath("")+"moviesImg\\"+movName+"\\";
File folder = new File(rootpath);
if (!folder.exists() && !folder.isDirectory()) {
folder.mkdirs();
System.out.println("创建文件夹");
}
String result = rootpath+file.getOriginalFilename();
file.transferTo(new File(rootpath+file.getOriginalFilename()));
return result;
}
}
其中可以用FileUtils.copyInputStreamToFile(file.getInputStream,<磁盘路径名>)将文件持久化保存在磁盘上,上面演示的代码将文件保存在服务器中,即Tomcat文件夹
最重要的Controller类
第一次(错误代码)
@PostMapping(value = "/insertMovie.do")
@ResponseBody
public Boolean insertMovie(
Movie movie,
@RequestParam("imagefile") MultipartFile imagefile,
@RequestParam(name="photosfiles") List<MultipartFile> photosfiles,
HttpServletRequest request) throws IOException {
这是我第一次写的Controller里面的参数,没有报错,但是Movie并没有传进去,输出只是个 [],什么都没有。
第二次(错误代码)
@PostMapping(value = "/insertMovie.do")
@ResponseBody
public Boolean insertMovie(
@RequestBody Movie movie,
@RequestParam("imagefile") MultipartFile imagefile,
@RequestParam(name="photosfiles") List<MultipartFile> photosfiles,
HttpServletRequest request) throws IOException {
查看了网上的解决办法,基本上是在Movie前添加一个**@RequestBody**注解,这次又重新测试,直接报错。415错误。
解决办法(可以正确实现功能)
@ApiOperation(value = "添加电影")
@PostMapping(value = "/insertMovie.do")
@ApiImplicitParams({
})
@ResponseBody
public Boolean insertMovie(
@RequestParam("movName") String movName,
@RequestParam("movDescription") String movDescription,
@RequestParam("movType") String movType,
@RequestParam("movStatus") int movStatus,
@RequestParam("movLastTime") int movLastTime,
@RequestParam("movDirector") String movDirector,
@RequestParam("movCore")Double movCore,
@RequestParam("movReleaseTime") Date movReleaseTime,
@RequestParam("movActor") String movActor,
@RequestParam("movIsCome") int movIsCome,
@RequestParam("movIsHot") int movIsHot,
@RequestParam("movArea") String movArea,
@RequestParam("imagefile") MultipartFile imagefile,
@RequestParam(name="photosfiles") List<MultipartFile> photosfiles,
HttpServletRequest request ) throws IOException {
String movImage = GetFileUrl.get(imagefile,movName,request);
StringBuffer movPhotosBuffer = new StringBuffer();
for(MultipartFile file : photosfiles){
movPhotosBuffer= movPhotosBuffer.append(GetFileUrl.get(file,movName,request)+" ");
}
String movPhotos = movPhotosBuffer.toString();
Movie movie = new Movie(null,movName, movDescription, movType, movStatus,
movLastTime, movDirector,movCore, movReleaseTime, movActor,
movIsCome, movIsHot, movImage, movPhotos, movArea,null,null);
System.out.println(movie);
return movieService.insertMovie(movie);
}
最后只好使用Movie的有参构造方法进行实现,虽然方法有点笨拙,但是功能实现了不是么。哈哈 ,希望有好办法的可以拿出来分享一下。
下面是我的测试,用的是PostMan,一款很实用的测试软件。
PostMan测试数据
图片: