实现上传图片

封装VO对象

@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class ImageVO {
 private Integer error;//错误提示 0程序运行正常 1.文件上传有误
 private String url;//图片访问的虚拟路径
 private Integer width;
 private Integer heigth;
 //设定上传失败的方法
 public static ImageVO fail(){
 return  new ImageVO(1,null,null,null);
 }
 //成功
 public static ImageVO success(String url,Integer width,Integer heigth){
 return  new ImageVO(0,url,width,heigth);
 }
}

FileController层

@RequestMapping("/pic/upload")
public ImageVO upload(MultipartFile uploadFile) throws IOException {
 return fileService.upload(uploadFile);
}

FileServiceImpl层

@Service
public class FileServiceImpl implements FileService{
 //准备一个存储图片的文件夹
 private String rootpath="C:/jt";
 //1.2准备图片的集合
 private static Set imageTypeSet;
 static {
 imageTypeSet=new HashSet<>();
 imageTypeSet.add(".jpg");
 imageTypeSet.add(".png");
 imageTypeSet.add(".gif");
 }
 /**
 * 校验:
 * 1.校验是否为图片
 * 2.校验是否为恶意的程序
 * 3.防止文件数量太多,分目录存储
 * 4.防止文件重名
 * 实现文件上传
 * @param uploadFile
 * @return
 * @throws IOException
 */
 @Override
 public ImageVO upload(MultipartFile uploadFile) throws IOException {
 //1.常见图片类型 jpg|png|gif…… //1.1获取当前图片的名称之后截取其中的类型
 String fileName=uploadFile.getOriginalFilename();
 int index = fileName.lastIndexOf(".");
 String fileType = fileName.substring(index);
 //转换为小写
 fileType= fileType.toLowerCase();
 //1.3判断图片类型是否正确
 if(!imageTypeSet.contains(fileType)){
 return ImageVO.fail();//图片类型不匹配
 }
 //2.恶意校验 根据宽度/高度进行校验
 //2.1利用工具API对象 读取字节信息 获取图片对象类型
 try{
 BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());
 //2.2校验是否有高度和宽度
 int width=bufferedImage.getWidth();
 int height=bufferedImage.getHeight();
 if (width==0||height==0)
 return ImageVO.fail();
 //3.防止文件数量太多,分目录存储
 //3.1 将时间按照指定的格式要求 转化为字符串
 String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
 .format(new Date());
 //3.2拼接文件存储的目录对象
 String fileDir=rootpath+dateDir;
 File dirFile=new File(fileDir);
 //3.3动态创建目录
 if(!dirFile.exists()){
 dirFile.mkdirs();
 }
 //4 防止文件重名
 //4.1 动态生成uuid
 String uuid=
 UUID.randomUUID().toString().replace("-","");
 String realFileName=uuid+fileType;
 //5 实现文件上传
 //5.1 拼接文件真实路径
 String realFilePath=fileDir+realFileName;
 //5.2 封装对象 实现上传
 File realFile=new File(realFilePath);
 uploadFile.transferTo(realFile);
 String url="https://img.alicdn.com/imgextra/i1/2978217349/O1CN01EwgFIG249tI2uaFx3_!!0-item_pic.jpg_430x430q90.jpg";
 return ImageVO.success(url,width,height);
 }catch (Exception e){
 e.printStackTrace();
 return ImageVO.fail();
 }
 }}

优化

实现上传图片_第1张图片

你可能感兴趣的:(spring)