SpringMVC 实现文件上传

1 文件上传的必要前提
A form 表单的 enctype 取值必须是: multipart/form-data
( 默认值是 :application/x-www-form-urlencoded)
enctype: 是表单请求正文的类型
B method 属性取值必须是 Post
C 提供一个文件选择域
2 文件上传的原理分析
form 表单的 enctype 取值不是默认值后, request.getParameter() 将失效
enctype=”application/x-www-form-urlencoded” 时, form 表单的正文内容是:
key=value&key=value&key=value
form 表单的 enctype 取值为 Mutilpart/form-data 时,请求正文内容就变成:
每一部分都是 MIME 类型描述的正文
-----------------------------7de1a433602ac 分界符
Content-Disposition: form-data; name="userName" 协议头
aaa 协议的正文
-----------------------------7de1a433602ac
Content-Disposition: form-data; name="file";
filename="C:\Users\zhy\Desktop\fileupload_demofile\b.txt"
Content-Type: text/plain 协议的类型( MIME 类型)
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-----------------------------7de1a433602ac--
3 借助第三方组件实现文件上传
使用 Commons-fileupload 组件实现文件上传,需要导入该组件相应的支撑 jar 包:Commons-fileupload 和
commons-io。commons-io 不属于文件上传组件的开发 jar 文件,但Commons-fileupload 组件从 1.1 版本开始,它
工作时需要 commons-io 包的支持。
第一步:拷贝文件上传的 jar 包到工程的 lib 目录
第二步:编写 jsp 页面
< form action = "/fileUpload" method = "post" enctype= "multipart/form-data" >
名称: < input type = "text" name = "picname" />< br />
图片: < input type = "file" name = "uploadFile" />< br />
< input type = "submit" value = " 上传 " />
form >
 
第三步:编写控制器
 
@Controller ( "fileUploadController" )
public class FileUploadController {
/**
* 文件上传
*/
@RequestMapping ( "/fileUpload" )
public String testResponseJson(String picname ,MultipartFile
uploadFile ,HttpServletRequest request ) throws Exception{
// 定义文件名
String fileName = "" ;
//1. 获取原始文件名
String uploadFileName = uploadFile .getOriginalFilename();
//2. 截取文件扩展名
String extendName =
uploadFileName .substring( uploadFileName .lastIndexOf( "." )+1,
uploadFileName .length());
//3. 把文件加上随机数,防止文件重复
String uuid = UUID. randomUUID ().toString().replace( "-" , "" ).toUpperCase();
//4. 判断是否输入了文件名
if (!StringUtils. isEmpty ( picname )) {
fileName = uuid + "_" + picname + "." + extendName ;
} else {
fileName = uuid + "_" + uploadFileName ;
}
System. out .println( fileName );
//2. 获取文件路径
ServletContext context = request .getServletContext();
String basePath = context .getRealPath( "/uploads" );
//3. 解决同一文件夹中文件过多问题
String datePath = new SimpleDateFormat( "yyyy-MM-dd" ).format( new Date());
//4. 判断路径是否存在
File file = new File( basePath + "/" + datePath );
if (! file .exists()) {
file .mkdirs();
}
//5. 使用 MulitpartFile 接口中方法,把上传的文件写到指定位置
uploadFile .transferTo( new File( file , fileName ));
return "success" ;
}
}
第四步:配置文件解析器
< bean id = "multipartResolver"
class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" >
< property name = "maxUploadSize" >
< value > 5242880 value >
property >
bean >
注意:
文件上传的解析器 id 是固定的,不能起别的名称,否则无法实现请求参数的绑定。(不光是文件,其他
字段也将无法绑定)

你可能感兴趣的:(springMvc)