Java 实现后台图片上传,将上传图片的接口进行分层,便于维护接口。
接口部分(interface)
将接口分为单图片上传以及多图片上传
public interface FileUploadService {
// 单图片上传
PicUploadResult uplodadImg(MultipartFile uploadFile, HttpServletRequest request);
// 多图片上传
PicUploadResult uploadManyImg(MultipartFile[] uploadFile, HttpServletRequest request);
}
接口实现类(interface impl)
上传图片方法类(主要)
上传多个图片只是使用了数组的方式将文件存到 MultipartFile 里面。以防代码冗余,所以将实现方法抽出来
/**
* 上传图片方法类
* @param multipartFile
* @param request
* @return
*/
private PicUploadResult uploadImgMethod(MultipartFile multipartFile, HttpServletRequest request) {
PicUploadResult picUploadResult = new PicUploadResult();
if (multipartFile.isEmpty()) {
// 返回选择文件提示
picUploadResult.setLegal(false);
return picUploadResult;
}
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd/”);
String format = sdf.format(new Date());
// 存放上传文件的文件夹
File file = new File(baseFilePath + format);
logger.info(“———– 存放上传文件的文件夹【” + file + “】———–“);
logger.info(“———– 输出文件夹绝对路径 — 这里的绝对路径是相当于当前项目的路径而不是“容器”路径【” + file.getAbsolutePath() + “】———–“);
if (!file.isDirectory()) {
// 递归生成文件夹
file.mkdirs();
}
// 获取原始的名字 original: 最初的,起始的 方法是得到原来的文件名在客户机的文件系统名称
String oldName = multipartFile.getOriginalFilename();
logger.info(“———– 文件原始的名字【” + oldName + “】———–“);
String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf(“.”), oldName.length());
logger.info(“———– 文件要保存后的新名字【” + newName + “】———–“);
try {
// 构建真实的文件路径
File newFile = new File(file.getAbsolutePath() + File.separator + newName);
// 转存文件到指定路径,如果文件名重复的话,将会覆盖掉之前的文件, 这里是把文件上传到“绝对路径”
multipartFile.transferTo(newFile);
String filePath = request.getScheme() + “://” + request.getServerName() + “:” + request.getServerPort() + “/picbook/” + UPLOAD_PATH_PREFIX + format + newName;
logger.info(“———–【” + filePath + “】———–“);
picUploadResult.setLegal(true);
picUploadResult.setImgPath(filePath);
return picUploadResult;
} catch (Exception e) {
e.printStackTrace();
}
picUploadResult.setLegal(false);
return picUploadResult;
}
esult uplodadImg(MultipartFile multipartFile, HttpServletRequest request) {
return uploadImgMethod(multipartFile, request);
}
多图片上传
外汇经纪商动态 http://www.fx61.com/news
public PicUploadResult uploadManyImg(MultipartFile[] uploadFile, HttpServletRequest request) {
List imgPaths = new ArrayList<>();
for (MultipartFile multipartFile : uploadFile) {
PicUploadResult picUploadResult = uploadImgMethod(multipartFile, request);
if(picUploadResult.isLegal()){
imgPaths.add(picUploadResult.getImgPath());
}else{
return picUploadResult;
}
}
PicUploadResult picUploadResult = new PicUploadResult();
picUploadResult.setLegal(true);
picUploadResult.setImgPahts(imgPaths);
return picUploadResult;
}
实现方法补充
// 项目上传至绝对路径(在 yml 里配置你的项目绝对路径)
@Value(“${file.save-path}”)
private String baseFilePath;
// 项目根路径下的目录 — SpringBoot static 目录相当于是根路径下(SpringBoot 默认)
private final static String UPLOAD_PATH_PREFIX = “statics/uploadFile/”;
控制层
public class FileUploadController {
// 允许上传的格式 图片形式
private static final String[] IMAGE_TYPE = new String[]{“.bmp”, “.jpg”, “.jpeg”, “.png”};
@Resource
private FileUploadService fileUploadService;
@PostMapping(“/uploadImg”)
public R uploadImg(@RequestParam(“file”) MultipartFile file, HttpServletRequest request) {
boolean isFlag = false;
for (String type : IMAGE_TYPE) {
System.out.println(file.getOriginalFilename());
if (StringUtils.endsWithIgnoreCase(file.getOriginalFilename(), type)) {
isFlag = true;
break;
}
}
if (isFlag) {
PicUploadResult picUploadResult = fileUploadService.uplodadImg(file, request);
boolean isLegal = picUploadResult.isLegal();
if (isLegal) {
Map resMap = new HashMap<>();
resMap.put(“imgPath”, picUploadResult.getImgPath());
return R.ok(resMap);
} else {
return R.error(“ 图片上传有误 ”);
}
} else {
return R.error(“ 上传的图片格式必须为:bmp,jpg,jpeg,png”);
}
}
@PostMapping(“/uploadManyImg”)
public R uploadManyImg(@RequestParam(“files”) MultipartFile[] files, HttpServletRequest request) {
boolean isFlag = false;
for (MultipartFile uploadFile : files) {
for (String type : IMAGE_TYPE) {
if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(), type)) {
isFlag = true;
break;
}
}
}
if (isFlag) {
PicUploadResult picUploadResult = fileUploadService.uploadManyImg(files, request);
boolean isLegal = picUploadResult.isLegal();
if (isLegal) {
Map resMap = new HashMap<>();
resMap.put(“imgPaths”, picUploadResult.getImgPahts());
return R.ok(resMap);
} else {
return R.error(“ 图片上传有误 ”);
}
} else {
return R.error(“ 上传的图片格式必须为:bmp,jpg,jpeg,png”);
}
}
}
工具类
根据实际情况添加所需的字段
public class PicUploadResult
{
private boolean isLegal;
private String imgPath;
private List imgPahts;
}