#32 文件上传类型判断
接触过很多系统,发现很多小伙伴在处理文件上传时,总是犯这样或那样的错误。其中一个就是对文件类型的判断。
很多小伙伴都仅仅判断文件名后缀来区别文件类型,特别是在Linux系统上,文件的执行并不依赖于文件的后缀,嗯,这很危险。
同样地,而如果仅仅判断content-type,对一些脚本的过滤也是不可取的。例如jsp/php/py的文件类型都是text。
正确的姿势应该判断content-type和文件名后缀,并把文件保存到没有执行权限的文件系统目录中。
下面是一段处理图片格式上传的代码:
@Controller
public class FileUploadController {
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public @ResponseBody boolean upload(MultipartFile file) {
if (file != null) {
return isImage(file);
}
return false;
}
private static boolean isImage(MultipartFile file) {
String contentType = file.getContentType();
if (contentType.toLowerCase().matches("image/(jpg|png|gif|bmp)")) {
String filename = file.getOriginalFilename();
if (filename.indexOf(".") > -1) {
String suffix = filename.substring(filename.lastIndexOf("."));
return suffix.toLowerCase().matches("\\.(jpg|png|gif|bmp)");
}
}
return false;
}
}