1.2 application.properties改名application.yml配置org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf org.projectlombok lombok true
spring:
thymeleaf:
# 页面目录
prefix: classpath:/templates/
# 后缀名
suffix: .html
1.3 templates文件夹下创建upload-image.html前端页面
upload-img
package com.xccafe.imageupload.util;
import java.util.UUID;
public class FileNameUtils {
public static String getSuffix(String fileName){
return fileName.substring(fileName.lastIndexOf("."));
}
public static String getFileName(String fileName){
String uuid = UUID.randomUUID().toString().replace("-","");
return uuid + getSuffix(fileName);
}
}
package com.xccafe.imageupload.util;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
public class FileUtils {
public static Integer getImageWidth(MultipartFile multipartFile){
try {
BufferedImage bufferedImage = ImageIO.read(multipartFile.getInputStream());
return bufferedImage.getWidth();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public static Integer getImageHeight(MultipartFile multipartFile){
try {
BufferedImage bufferedImage = ImageIO.read(multipartFile.getInputStream());
return bufferedImage.getHeight();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
3. 页面的访问方式和图片上传请求的控制层实现
首先先创建一个图片的vo类
package com.xccafe.imageupload.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class ImageVo {
private Integer statusCode;
private String url;
private Integer width;
private Integer height;
public static ImageVo fail(){
return new ImageVo(1,null,null,null);
}
public static ImageVo success(String url,Integer width,Integer height){
return new ImageVo(0,url,width,height);
}
}
UploadImagController.java
package com.xccafe.imageupload.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UploadImgController {
@RequestMapping("/")
public String index(){
return "upload-image";
}
}
启动服务访问地址http://localhost:8080/,如下图:
选择文件后上传,会出现404,F12可以看到以下信息
接下来我们要实现图片上传的功能。
4. 实现图片上传4.1 在此之前我们先配置一下图片上传的位置和允许上传的类型,resources目录下创建/properties/file_configuration.properties文件,
# 文件要上传保存的位置 file.localDir=E:/image/images # 文件支持的后缀名集合(以,分隔) file.suffixList=.jpg,.png,.gif,.jpeg
4.2 业务层创建接口UploadImageService和它的实现类UploadImageServiceImpl。
UploadImgController.java中添加以下代码
@Resource
private UploadImgService uploadImgService;
@ResponseBody
@RequestMapping("/fileUpload")
public ImageVo uploadImg(MultipartFile fileImg) throws IOException {
return uploadImgService.uploadImg(fileImg);
}
4.3 接下来顺势实现uploadImgService.uploadImg(fileImg)方法。
package com.xccafe.imageupload.service;
import com.xccafe.imageupload.vo.ImageVo;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
public interface UploadImgService {
ImageVo uploadImg(MultipartFile multipartFile) throws IOException;
}
package com.xccafe.imageupload.service.impl;
import com.xccafe.imageupload.service.UploadImgService;
import com.xccafe.imageupload.util.FileNameUtils;
import com.xccafe.imageupload.util.FileUtils;
import com.xccafe.imageupload.vo.ImageVo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@Service
@PropertySource("classpath:/properties/file_configuration.properties")
public class UploadImgServiceImpl implements UploadImgService {
@Value("${file.localDir}")
private String localDir;
@Value("${file.suffixList}")
private String suffix;
@Override
public ImageVo uploadImg(MultipartFile multipartFile) throws IOException {
//获取原始图片名称
String originalFilename = multipartFile.getOriginalFilename();
originalFilename = Objects.requireNonNull(originalFilename).toLowerCase();
//获取图片类型
String suffixName = FileNameUtils.getSuffix(originalFilename);
List strings = Arrays.asList(suffix.split(","));
//不包含规定的后缀名则直接返回失败
if (!strings.contains(suffixName)) {
return ImageVo.fail();
}
//创建日期目录--yyyy/MM/dd
String format = new SimpleDateFormat("yyyy/MM/dd").format(new Date());
//File对象封装文件路径
File file = new File(localDir + "/" + format);
//如果目录不存在创建多级目录
if (!file.exists()) {
boolean mkdirs = file.mkdirs();
System.out.println("日期文件夹" + (mkdirs ? "创建成功" : "创建失败"));
}
//根据是否存在宽高判断是否为图片而不是恶意文件
Integer imageWidth = FileUtils.getImageWidth(multipartFile);
Integer imageHeight = FileUtils.getImageHeight(multipartFile);
//uuid--文件名
String fileName = FileNameUtils.getFileName(originalFilename);
//文件上传
File newFile = new File(file.getAbsolutePath()+"/"+fileName);
multipartFile.transferTo(newFile);
return ImageVo.success(newFile.getAbsolutePath(), imageWidth,imageHeight);
}
}
搞完收工!选择一张图片去测试一下
上传成功!!!



