您的位置:首页 > 编程语言 > Java开发

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

2017-07-04 16:14 344 查看
在新项目中,项目组选择了之前重来没用过的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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SpringBoot 文件上传