工作原理
*HTTP文件上传的基本原理:
*使用html的标签,提交form的几个属性必须为: method=post encType=multipart/form-data;
method属性必须设为post的原因:值不是放在URL之后传递到服务器的;
encType属性:这个属性管理的是表单的MIME编码;
服务器端:
WEB服务器端程序接收到"mutipart.form-data"类型的HTTP请求消息后,其核心和基本的编程工作就是读取请求消息中的实体内容,然后解析出每个分区的数据,接着再从每个分区中解析出描述头和主体内容的部分。
要在jsp里获得上传的文件,就是通过request.getInputStream()来得到上传的整个post实体的流,用request.getHeader(“Content-Type”)来取得实体内容的分界字符串,然后根据http协议,分析取得的上传的实体流,把文件部分筛出来,然后在服务器端保存到磁盘文件中,另外因为上传文件时,form的属性enctype=“multipart/form-data”,所以其他表单参数在上传文件时也无法得到,除了筛出文件进行保存,还应该把其他的参数一起取出保存,以便在jsp程序中调用。
配置文件
SpringMVC用的是MultipartFile来进行文件的上传,所以我们首先配置MultipartResolver用于处理表单中的file
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--设置请求编码格式-->
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="104857600"/>
<property name="maxInMemorySize" value="4096"/>
</bean>
其中:
defaultEncoding=“UTF-8” 是请求的编码格式,默认为iso-8859-1
maxUploadSize="" 是上传文件的大小,单位为字节
maxInMemorySize="" 是阀值,低于此值,只保存在内存里,高于此值,在硬盘中生成临时文件
uploadTemoDir=“fileUpload/temp” 为上传文件的临时路径
创建简单表单用于上传
<form name="frmupload" action="" method="post" enctype="multipart/form-data">
上传人:<input id="name" type="text" name="name"/><br/>
请选择文件:<input id="file" type="file" name="uploadfile"/><br/>
<input type="submit" value="基于commons-fileuplad上传" onclick="check1()"/>
</form>
*注意:*在form标签中要加上enctype="multipart/form-data"表示该表单是要处理文件的。【很重要】
编写上传控制类
1.创建一个控制类:FileuploadController和一个返回结果的页面list.jsp
2.编写提交表单的action
@RequestMapping("/fileUpload1")
public String handleFormUpload1(@RequestParam("name") String name, @RequestParam("uploadfile")List<MultipartFile> uploadfile,
HttpServletRequest request, Model model){
//判断所上传文件是否存在
if (!uploadfile.isEmpty()&&uploadfile.size()>0){
//循环输出上传的文件
for (MultipartFile file:uploadfile){
//获取上传文件的原始名称
String originalFilename=file.getOriginalFilename();
//设置上传文件的保存地址目录
String dirPath=request.getServletContext().getRealPath("/upload/");
File filePath = new File(dirPath);
//如果保存文件的地址不存在,就先创建目录
if (!filePath.exists()){
filePath.mkdirs();
}
//使用UUID重新命名上传的文件名称(上传人_uuid_原始文件名称)
String newFilename=name+"_"+ UUID.randomUUID()+"_"+originalFilename;
try {
//使用MultipartFile接口的方法完成文件上传到指定位置
file.transferTo(new File(dirPath+newFilename));
}catch (Exception e){
e.printStackTrace();
model.addAttribute("msg","文件上传失败");
return "/jsp/success";
}
}
//跳转到成功页面
model.addAttribute("msg","文件上传成功");
return "/jsp/success";
}else {
model.addAttribute("msg","文件上传失败");
return "/jsp/success";
}
}
3.使用SpringMVC注解RequesParam来制定表单中的file参数;
4.指定一个用于保存文件的web项目路径;
5.通过MultipartFile的transferTo(File dest)这个方法来转存文件到指定的路径;
【文件名目录名或卷标语法不同问题!
不同的浏览器提交的文件名是不一样的,有些浏览器提交的文件命名是带有路径的。
如果遇到java.io.FileNotFoundException问题,尝试换浏览器,小编使用chrome浏览器,在使用IE打开时,出现此类问题。
】
完成。
MultipartFile类常用的一些方法:
String getContentType() 获取文件MIME类型;
InputStream getInputStream() 获取文件流
String getName() 获取表单中文件组件的名字
String getOriginalFilename() 获取上传文件的原名
long getSize() 获取文件的字节大小,单位为byte
boolean isEmpty() 判断是否为空
void transferTo(File dest) 保存到一个目标文件中