问题描述
我这边有个需求,需要将远程接收到的MultipartFile 转为File,在测试环境是正常运行,但在生产环境却报了 java.io.IOException: Directory ‘/CDDY_uploads/publish/dh/10006/image’ could not be created 的错。
java代码如下
MultipartFile multipartFile = (MultipartFile) entry.getValue();
String originalFilename = multipartFile.getOriginalFilename();
File file = new File(originalFilename);FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
排查
我发现“/CDDY_uploads/publish/dh/10006/image”并不是我本地的目录,我怀疑是multipartFile.getOriginalFilename()这个方法获取出来的文件名前面带了目录。把获取到的文件名打印出来后,发现果然是带了路径,发现了问题所在那就好办了。
解决
判断获取到的文件名是否带了路径,如果带了路径把路径去掉,再去根据文件名创建文件。
MultipartFile multipartFile = (MultipartFile) entry.getValue();
String originalFilename = multipartFile.getOriginalFilename();
log.debug("转换前文件originalFilename: {}", originalFilename);
//解决获取的文件名可能出现路径的问题
int index = originalFilename.lastIndexOf("/");
if( index != -1){
originalFilename = originalFilename.substring(index + 1);
}
log.debug("转换后文件originalFilename: {}", originalFilename);
File file = new File(originalFilename);
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
注意: 一般来讲通过postman、chrome浏览器发起的请求,获取出来的文件名是不带路径的,但是通过IE浏览器发起的请求获取出的文件名是带了路径的。