SpringBoot上传文件跟传统的SpringMVC的区别

  • Post author:
  • Post category:其他





在新项目中,项目组选择了之前重来没用过的SpringBoot。今天再处理文件上传时起初就照搬了之前项目中SpringMVC的配置和代码,结果总是报参数不存在的错误,改来改去弄了很久才在网上找到解决问题的办法,在此记录一下!


一、先来看一下传统的SpringMVC处理文件上传怎么做的



       <dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.5</version>
		</dependency>
		
		<dependency>
		   <groupId>commons-fileupload</groupId>
		   <artifactId>commons-fileupload</artifactId>
		   <version>1.2.1</version>
       </dependency>


     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
	     <property name="defaultEncoding" value="utf-8"></property>   
	     <property name="maxUploadSize" value="10485760000"></property>  
	     <property name="maxInMemorySize" value="10485760"></property>  
     </bean>


	//保存图片的绝对路径
    @Value("${picture_absolute_path}")
    private String picture_absolute_path;
    
	//图片扩展名
	@Value("${picture_extension}")
	private String picture_extension;
	
	//图片服务器网址
	@Value("${picture_service_url}")
	private String picture_service_url;
	
	//图片大小
	@Value("${picture_max_size}")
	private String picture_max_size;
	
	@RequestMapping(value="/upload_picture",produces={"application/json;charset=UTF-8"})
	@ResponseBody
	public String uploadPicture(@RequestParam("editormd-image-file") CommonsMultipartFile file){
		if(file == null){
			return createResultJson(0, "图片不能为空", "");
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
		String month_format = sdf.format(new Date());
	    String dir=  picture_absolute_path+File.separator+month_format;
	    File dirFile = new File(dir);
	    if(!dirFile.exists()){
	    	dirFile.mkdirs();
	    }
		Long fileSize = null;
		String regex = "^[1-9]\\d*$";
		if(picture_max_size!=null && picture_max_size.matches(regex)){
			fileSize = Long.valueOf(picture_max_size);
		}
		String uuid = UUIDGenerator1.getUUID();
		try{
			String fileName = Strings.nullToEmpty(file.getOriginalFilename());
			//图片扩展名
			String fileExt = fileName.substring(fileName.lastIndexOf("."));
			if(fileSize!=null){
				if(file.getSize()>fileSize){
					log.error("图片大小超过限制:{}",fileName);
					return createResultJson(0, "图片不能超过"+(fileSize/1024/1024)+"M","");
				}
			}
			//文件重命名
			String newFileName = uuid+fileExt;
			if(picture_extension==null || picture_extension.length()==0 ||
					fileName.matches(".*\\.("+picture_extension+")")){
				File targetFile = new File(dir+File.separator+newFileName);
				file.transferTo(targetFile);
				return createResultJson(1, "success", picture_service_url+month_format+File.separator+newFileName);
			}else{//格式不正确
				log.error("图片格式不正确:{}",fileName);
				return createResultJson(0, "图片格式不正确","");
			}
		
		}catch(Exception fe){
			fe.printStackTrace();
			log.error("图片上传失败:{}",fe.getMessage());
			return createResultJson(0, "图片上传失败","");
		}
	}
	
	public String createResultJson(int success,String message,String url){
		JSONObject re = JSONObject.fromObject("{}");
		re.put("success", success);
		re.put("message", message);
		re.put("url",url);
		return re.toString();
	}


二、在SpringBoot中就需要把上面配置到Spring的配置文件中的CommonsMultipartResolver配置到启动项的配置中去(ps:SpringBoot还不是很熟),Controller代码不变。

@Configuration
@ImportResource(locations = { "classpath:applicationContext.xml"})
//exclude表示自动配置时不包括Multipart配置
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
@ComponentScan
@SpringBootApplication
@ServletComponentScan(value={"com.xunlei","cn.xunlei","cn.xunlei.cbase.xlalarm"})
public class xlalarmApplication {

	public static void main(String[] args) {
		SpringApplication.run(xlalarmApplication.class, args);
	}
	
    //显示声明CommonsMultipartResolver为mutipartResolver
    @Bean(name = "multipartResolver")
       public MultipartResolver multipartResolver(){
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("UTF-8");
//        resolver.setResolveLazily(true);//resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
        resolver.setMaxInMemorySize(40960);
        resolver.setMaxUploadSize(10*1024*1024);//上传文件大小 10M 10*1024*1024
        return resolver;
    }   
	

}



版权声明:本文为eric520zenobia原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。