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

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

图片: postman测试数据

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值