Spring MVC对文件上传提供了很好的支持,但是很多新手可能会由于一些细节不注意经常会出这样或那样的问题,今天我就打算把这几天在使用过程中所遇到的问题记录并分享一下,如若不对,还望批评指正。
jar包配置
<!-- Spring jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<!-- 配置fileupload 支持文件上传,不然功能无法使用 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
Spring MVC配置文件:
<!-- 配置Spring组件扫描 -->
<context:component-scan base-package="controller"/>
<!-- 配置Spring MVC注解扫描 -->
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 配置文件处理器multipart -->
<!-- 为什么使用commont包下的文件处理器就报错 :因为没有导jar包-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
页面:
表单提交方式必须是post,且必须加上enctype属性,指定数据格式为multipart/form-data
<!-- enctype属性必须要加不然报错 -->
<form action="upfile.do" method="post" enctype="multipart/form-data" >
<p>头像<input type="file" name="file"></p>
<input type="submit" value="上传">
</form>
控制层方法:
@RequestMapping("upfile.do")
public String upFile(MultipartFile file,HttpServletRequest request){
//如果文件为null抛异常
if(file==null){
System.out.println("file is null");
return "erroe";
}
String Originalname = file.getOriginalFilename();
String type = file.getContentType();
long size = file.getSize();
String name = file.getName();
System.out.println("Originalname:"+Originalname+" type:"+type+
" size:"+size+" name:"+name);
//把文件存入指定文件夹
File img = new File("F:"+File.separator+"test4"+File.separator+"img");
//创建目录
if(!img.exists()){
img.mkdirs();
}
//给文件起名
String names = Originalname;
//文件保存的位置
File imgs = new File("F:"+File.separator+"test4"+File.separator+"img"+File.separator+names);
long start = System.currentTimeMillis();
try {
//使用文件输出流(方法一)
// byte[] f = file.getBytes();
//创建一个图片文件输出流
// FileImageOutputStream fos = new FileImageOutputStream(imgs);
// fos.write(f);
// fos.close();
//MultipartFile提供的文件上传的方法(方法二)
// file.transferTo(imgs);
//使用MultipartHttpServletRequest(方法三)
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
//获得该请求下的所有的文件并存进一个map,key为表单上的name属性值
Map<String,MultipartFile> files = multipartRequest.getFileMap();
//获得自己想要的文件
MultipartFile imgFile = files.get("file");
//此时的imgFile相当于这个方法参数file,这里是手动取
imgFile.transferTo(imgs);
} catch (IOException e) {
e.printStackTrace();
}
long endtime = System.currentTimeMillis();
System.out.println("文件上传的时间为:"+(endtime-start)+"毫秒");
return "success";
}
经测试上传一个12.5k的图片文件三种方法用时情况如下
方法一:34毫秒
方法二:6毫秒
方法三:4毫秒
当文件越大时,方法二速度更快,这里建议使用方法二
参考文章:https://www.cnblogs.com/zhangzhen894095789/p/6475033.html