概念
- 客户端将文件传输到服务器上称为文件上传
- 文件上传是 B/S 项目中必不可少的功能点
实现文件上传
- 使用框架提供的文件上传解析器来处理文件上传时,需要用到 MultipartResolver 接口
- 框架提供了实现 MultipartResolver 接口的通用多部分解析器 CommonsMuItipartResoIver
- 做文件上传时需要配置该解折
单个文件上传步骤
- 引 jar 包
commons-fileupload-1.3.1.jar
commons-io-2.2.jar - 配置文件中添加配置
- 提供表单页面
- 提供控制器
代码演示
配置文件中添加配置 提供表单页面
提供控制器
//跳转页面,跳转到表单页面
@RequestMapping("/toSinglePage.do")
public String toSinglePage() {
return "single";
}
//处理文件上传的方法
@RequestMapping("/doUpload.do")
public String doUpload(@RequestParam("singleFile")MultipartFile file,HttpServletRequest request) throws IllegalStateException, IOException {
//声明:将name将singleFile的文件绑定到参数file上
//文件不为空的时候才进行文件上传处理
if(!file.isEmpty()) {
/*
* //存放文件的目标路径:缺点在于不够灵活,必须要自己写路径
String targPath="E:/kgc/";
//创建一个文件
File tempFile = new File(targPath+file.getOriginalFilename());
*/
//通过request获取文件存储路径
String realPath = request.getSession().getServletContext().getRealPath("upload");
//处理文件名重复:示例:java.jpg
//获得原始文件名
String oFname = file.getOriginalFilename();//java.jpg
//获得后缀名
String suffix = oFname.substring(oFname.indexOf(".") - 1, oFname.length());//.jpg
//通过uuid生成随机码 + suffix组成完整文件名,避免文件名重复
String norepeatName = UUID.randomUUID().toString()+suffix;
//创建一个文件:如果文件名用原始文件名,容易出现重名,所以需要处理重名的机制
File tempFile = new File(realPath+"/" + norepeatName);
//文件转换
file.transferTo(tempFile);
}
return "success";
}
多个文件上传步骤
- (参考单个文件上传)
- (参考单个文件上传)
- 提供表单页面
- 提供控制器
代码演示
提供表单页面提供控制器
//跳转页面
@RequestMapping("/toMultiPage.do")
public String toMultiPage() {
return "multi";
}
//处理多文件上传
@RequestMapping("/doMulti.do")
public String doMulti(@RequestParam("multis")MultipartFile[] files,HttpServletRequest request) throws IllegalStateException, IOException {
//判断是否收到了多个文件
if(files.length>0) {
for(MultipartFile file:files) {
//逐个处理文件
//处理文件名防止重复
//获取原始文件名
String oName = file.getOriginalFilename();
//获取后缀名
oName.substring(oName.indexOf(".") - 1 , oName.length());
//通过uuid工具获取不会重复的文件名
String fileName = UUID.randomUUID()+oName;
//获取到的是服务器下的文件路径
String realPath = request.getSession().getServletContext().getRealPath("upload");
File tempFile = new File(realPath + "/" + fileName);
//文件转换
file.transferTo(tempFile);
}
}
return "success";
}