最近做了一个多文件上传,其实和一般的文件上传功能大同小异,文件在服务器创建文件时,先判断路径是否存在,再去创建多级文件夹的文件。之前由于不大了解总报错,后面发现是路径问题
一、报错问题
java.io.IOException: java.io.FileNotFoundException:
/***/**.png (Is a directory)
(No such file or directory)
这两个报错都是我们拼接路径的问题,由于前端上传的文件是遍历文件夹的方式,原始文件名是包含/***/***.png
它的原文件夹路径的,处理上要注意。
二、功能实现
2.1Controller
/**
* 多个文件/文件夹上传上传
* 批量上传
* (随机文件夹目录保存上传的所有文件,返回相对路径)
* @return url
*/
@RequestMapping(value = "/filesUpload")
public String filesUpload(@RequestParam(value = "files") MultipartFile[] files) {
String url = "";
try {
url = numberPersonService.filesUpload(files);
} catch (Exception e) {
return ""+ e;
}
return url;
}
2.2ServiceImpl
@Override
public String filesUpload(MultipartFile[] files) {
// String url = "D:\\file";
String url = "/***/filetomcat/webapps";
String path = "/file/***/" + RandomStringUtils.randomAlphanumeric(4)+ System.currentTimeMillis()+ "/";
//判断file数组不能为空并且长度大于0
log.info("files.length :"+ files.length);
if (files != null && files.length > 0) {
//循环获取file数组中得文件
for (int i = 0; i < files.length; i++) {
MultipartFile file = files[i];
//保存文件
if(saveFile(file, url+path)){
log.info("filesUpload - url :"+ url+path);
}
}
}else {
path = "500";
}
return path;
}
/***
* 保存多个文件,并且能创建子文件夹
* @return
*/
private boolean saveFile(MultipartFile file, String path ) {
// 判断文件是否为空
if (!file.isEmpty()) {
try {
File filepath;
if ( !file.getOriginalFilename().contains("/")) {
filepath = new File(path);
}else {
//截取最后一个“/” 之前
String n=file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("/"));
//截取最后一个“/” 之后
// String n1=path.substring(file.getOriginalFilename().lastIndexOf("/"));
filepath = new File(path + n);
}
//判断该目录是否有文件夹 没有则创建
if (!filepath.exists()){
filepath.mkdirs();
}
// 目标文件保存路径
String savePath = path + file.getOriginalFilename();
// 转存文件
file.transferTo(new File(savePath));
return true;
} catch (Exception e) {
e.printStackTrace();
log.error(" saveFile path" + path + e );
}
}
return false;
}