1.在application.yml中取消对文件上传限制
2.MultipartFile上传文件
2.1、MultipartFile接口分析
【MultipartFile接口源码】
public interface MultipartFile extends InputStreamSource {
/**
*
*/
String getName();
/**
* 获取客户端上传文件的名称,包含扩展名
*/
@Nullable
String getOriginalFilename();
/**
* 上传文件内容的类型
*/
@Nullable
String getContentType();
/**
* 文件是否为空
*/
boolean isEmpty();
/**
* 以字节形式返回文件大小
*/
long getSize();
/**
*
*/
byte[] getBytes() throws IOException;
/**
* 一个InputStream读取的内容,返回值类型InputStream
*/
@Override
InputStream getInputStream() throws IOException;
/**
* 转存文件
*/
void transferTo(File dest) throws IOException, IllegalStateException;
}
2.2、上传文件应用
在Controller层接受一般使用MultipartFile类,因MultipartFile类是实现文件上传。MultipartFile类的getOriginalFilename()方法获取到上传文件的名称;而MultipartFile类的transferTo方法是转存文件。如果想要获取上传文件的扩展名得使用common- fileupload包下的FilenameUtils类的getExtension()方法。
我们这里是把上传功能放在service层
private static final Logger logger = LoggerFactory.getLogger(UploadService.class);
// 支持的文件类型
private static final List<String> suffixes = Arrays.asList("image/png", "image/jpeg");
public String upload(MultipartFile file) {
try {
// 1、图片信息校验
// 1)校验文件类型
String type = file.getContentType();
if (!suffixes.contains(type)) {
logger.info("上传失败,文件类型不匹配:{}", type);
return null;
}
// 2)校验图片内容
BufferedImage image = ImageIO.read(file.getInputStream());
if (image == null) {
logger.info("上传失败,文件内容不符合要求");
return null;
}
// 2、保存图片
// 2.1、生成保存目录
File dir = new File("D:\\heima\\upload");
if (!dir.exists()) {
dir.mkdirs();
}
// 2.2、保存图片
file.transferTo(new File(dir, file.getOriginalFilename()));
// 2.3、拼接图片地址
String url = "http://image.leyou.com/upload/" + file.getOriginalFilename();
return url;
} catch (Exception e) {
return null;
}
}
}
【代码中注意事项】
- (1)MultipartFile类是spring中的类;MultipartFile类的transferTo()方法是把文件转存到磁盘;
- (2)ImageIO判断文件是否是图片。
3.页面上的表单enctype
如果我们的页面是from表单,需要做如下设置:
一般需要在页面表单上添加属性enctype="multipart/form-data"。