Java实现图片文件上传
Java实现后台图片上传,将上传图片的接口进行分层,便于维护接口。
接口部分(interface)
将接口分为单图片上传以及多图片上传
ublicinterfaceFileUloadService{
单图片上传
PicUloadResultulodadImg(MultiartFileuloadFile,HttServletRequestquest); 多图片上传
PicUloadResultuloadManyImg(MultiartFile[]uloadFile,HttServletRequestquest);
}接口实现类(interfaceiml)
上传图片方法类(主要)
上传多个图片只是使用了数组的方式将文件存到MultiartFile里面。以防代码冗余,所以将实现方法抽出来
**
*上传图片方法类
*@arammultiartFile
*@aramquest
*@turn
*
rivatePicUloadResultuloadImgMethod(MultiartFilemultiartFile,HttServletRequestquest){
PicUloadResulticUloadResult=newPicUloadResult();if(multiartFile.isEmty()){
返回选择文件提示
icUloadResult.setLegal(false);
turnicUloadResult;
}
SimleDateFormatsdf=newSimleDateFormat("yyyy-MM-dd");
Stringformat=sdf.format(newDate());
存放上传文件的文件夹
Filefile=newFile(baseFilePath+format);
logger.info("-----------存放上传文件的文件夹【"+file+"】-----------");
logger.info("-----------输出文件夹绝对路径--这里的绝对路径是相当于当前项目的路径而不是“容器”路径【"+file.getAbsolutePath()+"】-----------");
if(!file.isDictory()){
递归生成文件夹
file.mkdirs();
}
获取原始的名字original:最初的,起始的方法是得到原来的文件名在客户机的文件系统名称
StringoldName=multiartFile.getOriginalFilename();
logger.info("-----------文件原始的名字【"+oldName+"】-----------");
StringnewName=UUID.randomUUID().toString()+oldName.substring(oldName.lastIndexOf("."),oldName.length());
logger.info("-----------文件要保存后的新名字【"+newName+"】-----------");
try{
构建真实的文件路径
FilenewFile=newFile(file.getAbsolutePath()+File.searator+newName);
转存文件到指定路径,如果文件名重复的话,将会覆盖掉之前的文件,这里是把文件上传到“绝对路径”
multiartFile.transferTo(newFile);
StringfilePath=quest.getSche()+":"+quest.getServerName()+":"+quest.getServerPort()+"icbook"+UPLOAD_PATH_PREFIX+format+newName;
logger.info("-----------【"+filePath+"】-----------");
icUloadResult.setLegal(true);
icUloadResult.setImgPath(filePath);
turnicUloadResult;
}catch(Excetione){
e.rintStackTrace();
}
icUloadResult.setLegal(false);
turnicUloadResult;
}实现方法接口
单图片上传
ublicPicUloadResultulodadImg(MultiartFilemultiartFile,HttServletRequestquest){
turnuloadImgMethod(multiartFile,quest);
}多图片上传
ublicPicUloadResultuloadManyImg(MultiartFile[]uloadFile,HttServletRequestquest){List<String>imgPaths=newArrayList<>();
for(MultiartFilemultiartFile:uloadFile){
PicUloadResulticUloadResult=uloadImgMethod(multiartFile,quest);
if(icUloadResult.isLegal()){
imgPaths.add(icUloadResult.getImgPath());
}else{
turnicUloadResult;
}}PicUloadResulticUloadResult=newPicUloadResult();
icUloadResult.setLegal(true);
icUloadResult.setImgPahts(imgPaths);
turnicUloadResult;
}实现方法补充
项目上传至绝对路径(在yml里配置你的项目绝对路径)
@Value("${file.save-ath}")
rivateStringbaseFilePath;
项目根路径下的目录--SringBootstatic目录相当于是根路径下(SringBoot默认)
rivatefinalstaticStringUPLOAD_PATH_PREFIX="staticsuloadFile";控制层
ublicclassFileUloadController{
允许上传的格式图片形式
rivatestaticfinalString[]IMAGE_TYPE=newString[]{".bm",".jg",".jeg",".ng"};@Resource
rivateFileUloadServicefileUloadService;@PostMaing("uloadImg")
ublicRuloadImg(@RequestParam("file")MultiartFilefile,HttServletRequestquest){
booleanisFlag=false;
for(Stringtye:IMAGE_TYPE){
Syst.out.rintln(file.getOriginalFilename());
if(StringUtils.endsWithIgnoCase(file.getOriginalFilename(),tye)){
isFlag=true;
eak;
}
}if(isFlag){
PicUloadResulticUloadResult=fileUloadService.ulodadImg(file,quest);
booleanisLegal=icUloadResult.isLegal();if(isLegal){
MasMa=newHashMa<>();
sMa.ut("imgPath",icUloadResult.getImgPath());
turnR.ok(sMa);
}else{
turnR.error("图片上传有误");
}
}else{
turnR.error("上传的图片格式必须为:bm,jg,jeg,ng");
}}@PostMaing("uloadManyImg")
ublicRuloadManyImg(@RequestParam("files")MultiartFile[]files,HttServletRequestquest){
booleanisFlag=false;
for(MultiartFileuloadFile:files){
for(Stringtye:IMAGE_TYPE){
if(StringUtils.endsWithIgnoCase(uloadFile.getOriginalFilename(),tye)){
isFlag=true;
eak;
}
}
}if(isFlag){
PicUloadResulticUloadResult=fileUloadService.uloadManyImg(files,quest);
booleanisLegal=icUloadResult.isLegal();if(isLegal){
MasMa=newHashMa<>();
sMa.ut("imgPaths",icUloadResult.getImgPahts());
turnR.ok(sMa);
}else{
turnR.error("图片上传有误");
}
}else{
turnR.error("上传的图片格式必须为:bm,jg,jeg,ng");
}
}
}工具类
根据实际情况添加所需的字段
ublicclassPicUloadResult
{
rivatebooleanisLegal;rivateStringimgPath;rivateList<String>imgPahts;}Postman(仅用于个人学习编码记录,代码均参考于百度以及自己改进,如有疑问欢迎大家积极讨论)