上传文件淌过的坑
转载自:https://blog.csdn.net/HuiTuLang/article/details/51596572
源自上传文件的异常定位:
@RestController
public class FileUploadController {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
@PostMapping("/upload")
public String uploadFile(MultipartFile file, HttpServletRequest req){
String format = sdf.format(new Date());
String realPath = req.getServletContext().getRealPath("/img")+format;
File folder = new File(realPath);
if (!folder.exists()){
folder.mkdirs();
}
String oldName = file.getOriginalFilename();
String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));
try {
file.transferTo(new File(folder, newName));
String url = req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+"/img"+format+newName;
return url;
} catch (IOException e) {
e.printStackTrace();
}
return "error";
}
今天有人问我,为什么他的权限写了,使用File.mkdir()却创建不了文件,我觉得这个要和大家分享一下,让大家少走弯路。
1、先来看File.mkdirs()
File dir = new File("Environment.getExternalStorageDirectory().getPath()/xxx/yyy");
if (!dir.exists()) {
dir.mkdirs();
}
解说:这是一个在SDCard上建立文件的方法,mkdirs()方法一般是用来建立“多级”文件夹目录的,(当你不知道此文件夹是否存在,也不知道父文件夹存在不存在),就可用此方法,它建立文件夹的原则是:如果父文件夹不存在并且最后一级子文件夹不存在,它就自动新建所有路经里写的文件夹;如果父文件夹存在,那么它就会直接在已经存在的父文件夹下新建子文件夹。
拿上面的例子来说,当xxx这个父级文件夹不存在且yyy这个文件夹也不存在时,那么当new这个file时,会自动创建“xxx/yyy”这个层级文件夹,如果xxx这个父级文件夹存在,那么就直接在xxx下面一级创建yyy这个文件夹。
2、File.mkdir()
File dir = new File("Environment.getExternalStorageDirectory().getPath()/xxx/yyy");
解说:如果你想在已经存在的文件夹yyy下建立新的文件夹(zzz文件夹),就可以用File.mkdir()方法。此方法不能在不存在的文件夹下建立新的文件夹。必须要现有父文件夹才能在父文件夹下建立想要的子文件夹,也就是现有爸爸才能有儿子。假如想建立名字是"/xxx/yyy/zzz"文件夹,那么它的父文件夹必须存在。它一般用来创建单级目录。
对了,补充一点,file.mkdir() 和file.mkdirs()它们只是用来创建文件夹目录,如果想要创建xxx.jpg,xxx.txt这样的文件,需要这样
/**
* 在SD卡上创建文件
*
* @throws IOException
*/
public File creatSDFile(String fileName) throws IOException {
File file = new File(fileName);
file.createNewFile();
return file;
}