思路
- 首先检查文件后缀是否是合法(比如.png,.jpg),列出对应的媒体类型(image/png,image/jpeg)
- 检查文件的内容是否是图片,防止破坏者将脚本后缀改为图片格式,图片是有宽和高的
- 保存到图片服务器,比如fastDFS图片存储服务器
- 回显Url(本案例将本地作为图片存储服务器,本地配置了一个域名,使用nginx代理到存储目录)
实例代码
@Service
public class UploadServiceImpl implements UploadService {
//保存日志的对象
private static final Logger logger = LoggerFactory.getLogger(UploadController.class);
// 允许存储的文件类型白名单
private static final List<String> suffixes = Arrays.asList("image/png", "image/jpeg");
public String upload(MultipartFile file) {
try {
// 校验文件类型
String type = file.getContentType();
if (!suffixes.contains(type)) {
//此处的{}相当于字符串的占位符
logger.info("上传失败,文件类型不匹配:{}", type);
return null;
}
// 校验图片内容
BufferedImage image = ImageIO.read(file.getInputStream());
if (image == null) {
logger.info("上传失败,文件内容不符合要求");
return null;
}
// 生成保存目录
File dir = new File("G:\LeYou\upload");
if (!dir.exists()) {
dir.mkdirs();
}
//保存图片,第一个参数是路径,第二个参数是文件名,使用MultipartFile file获取源文件文件名
file.transferTo(new File(dir, file.getOriginalFilename()));
// 拼接图片地址,
String url = "http://image.leyou.com/upload/" + file.getOriginalFilename();
return url;
} catch (Exception e) {
return null;
}
}
}