springMVC同时上传多文件和参数后端接收

spring上传文件和参数后端接收

我要实现的功能是管理员添加一部电影,电影中含有海报、剧照两种文件类型以及其他电影相关信息,而海报只有一张,剧照可以上传很多张,添加成功后,文件将保存在本地,数据库会多出一条记录,在数据库中,海报剧照存储的是本地绝对路径。每个剧照url中间用空格隔开。

jar包。

	
            commons-io
            commons-io
            1.3.2
       
       
            commons-fileupload
            commons-fileupload
            1.2.1
       

配置文件springMVC.xml


    
        
        
            52428800
        
        
    

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 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 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 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测试数据

图片: springMVC同时上传多文件和参数后端接收_第1张图片

你可能感兴趣的:(上传文件,spring,如何上传文件并保存)