创建图片格式校验拦截器 ImageSupportInterceptor 继承 HandlerInterceptorAdapter
代码如下:
import cn.hutool.json.JSONUtil;
import com.cdc.iss.icsp.crawler.wordchecker.meta.Result;
import com.cdc.iss.icsp.crawler.wordchecker.util.ResultUtil;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Iterator;
import java.util.List;
@Slf4j
@Component
public class ImageSupportInterceptor extends HandlerInterceptorAdapter {
//只支持jpg和jpeg
private final static String IMAGE_SUFFIX_SUPPORT = "jpg,jpeg";
@Resource
private MultipartResolver multipartResolver;
@Override
public boolean preHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler) throws Exception {
boolean multipart = this.multipartResolver.isMultipart(request);
if (multipart) {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
List<MultipartFile> files = multipartRequest.getFiles("file");
if (!files.isEmpty()) {
for (MultipartFile file : files) {
try (ImageInputStream imageInputStream = ImageIO.createImageInputStream(file.getInputStream())) {
Iterator<ImageReader> imageReaders = ImageIO.getImageReaders(imageInputStream);
while (imageReaders.hasNext()) {
ImageReader next = imageReaders.next();
String formatName = next.getFormatName();
if (!supportImage(formatName)) {
Result<?> result = ResultUtil.result(400, formatName + "图片类型不支持!");
response.setContentType("application/json;charset=utf-8");
response.getWriter().println(JSONUtil.toJsonStr(result));
return false;
}
next.dispose();
}
}
}
}
}
return super.preHandle(request, response, handler);
}
private boolean supportImage(String suffix) {
return IMAGE_SUFFIX_SUPPORT.contains(suffix);
}
}
配置拦截器:
import com.cdc.iss.icsp.crawler.wordchecker.interceptor.ImageSupportInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Resource
private ImageSupportInterceptor imageSupportInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(imageSupportInterceptor);
WebMvcConfigurer.super.addInterceptors(registry);
}
}
图片上传:
import com.cdc.iss.icsp.crawler.wordchecker.meta.Result;
import com.cdc.iss.icsp.crawler.wordchecker.util.ResultUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
@RestController
@RequestMapping("/image")
public class ImageController {
@GetMapping("/upload")
public Result<?> check(MultipartFile file) throws IOException {
System.out.println(file.getBytes().length);
file.transferTo(new File("C:\\Users\\admin\\image\\sdakfhaj.jpg"));
return ResultUtil.ok(file.getOriginalFilename());
}
}