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; }
实现方法接口
单图片上传
public PicUploadResult uplodadImg(MultipartFile multipartFile, HttpServletRequest request) { return uploadImgMethod(multipartFile, request); }
多图片上传
public PicUploadResult uploadManyImg(MultipartFile[] uploadFile, HttpServletRequest request) { ListimgPaths = 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 ListimgPahts; }
Postman
(仅用于个人学习编码记录,代码均参考于百度以及自己改进,如有疑问欢迎大家积极讨论)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。