Java实现图片文件上传
短信预约 -IT技能 免费直播动态提醒
Java实现后台图片上传,将上传图片的接口进行分层,便于维护接口。
接口部分(interface)
将接口分为单图片上传以及多图片上传
public interface FileUploadService {
//单图片上传
PicUploadResult uplodadImg(MultipartFile uploadFile, HttpServletRequest request);
//多图片上传
PicUploadResult uploadManyImg(MultipartFile[] uploadFile, HttpServletRequest request);
}
接口实现类(interface impl)
上传图片方法类(主要)
上传多个图片只是使用了数组的方式将文件存到MultipartFile里面。以防代码冗余,所以将实现方法抽出来
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) {
List<String> 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<String> imgPahts;
}
Postman
(仅用于个人学习编码记录,代码均参考于百度以及自己改进,如有疑问欢迎大家积极讨论)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341