1/SysResult结果集对象.
@Data //生成set get 重写方法
@Accessors(chain = true) //重写set
@NoArgsConstructor
@AllArgsConstructor
public class SysResult {
private Integer status;//状态.200表示服务器请求成功 201表示服务器异常
private String msg;//服务器返回的提示信息
private Object data;//服务器返回的业务数据.
public static SysResult fail(){ //客户端请求错误信息,就服务端返回失败方法,并告知状态且提示失败信息.
return new SysResult(201, "服务器处理失败", null);
}
public static SysResult success(){//客户端请求成功,且无需返回值,直接返回状态,提示.
return new SysResult(200, "服务器处理成功", null);
}
public static SysResult success(Object data){//请求成功,传来请求发送的数据,成功需要返回值data,并返回状态,成功提示
return new SysResult(200, "服务器处理成功", data);
}
public static SysResult success(String msg,Object data){//请求成功,传来数据,根据客户端数据变化提示信息.成功且返回data
return new SysResult(200, msg, data);
}
2/简单文件上传样式.
/ @PostMapping("/upload")
public SysResult upload(MultipartFile file ) throws IOException {
//MultipartFile spring框架提供的接受文件的对象.接受上传的文件
//1.获取文件的名称
String fileName= file.getOriginalFilename();//接受对象MultipartFile 提供的方法获取文件名
//2.定义上传路径 绝对路径
String fileDir="D:/XX/XX";//自己的磁盘地址用来存储这些接受的文件.
File dirFile=new File(fileDir);//创建一个文件对象API工具.
if (!dirFile.exists()){
//如果传来的文件不存在,则应该创建一个新的目录来存储文件
dirFile.mkdirs();//创建多级目录
}
//3.指定文件上传的全路径,目录加名称
String filePath=fileDir+"/"+fileName;
// File f=new File(filePath) 是一个对象.
//4.文件上传.
file.transferTo(new File(filePath));//调用输出流,outputStream
//transferTo将接收文件传输到给定目标路径
return SysResult.success();
}
3.创建类ImageVO
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ImageVO {
private String virtualPath; //文件的动态路径
private String urlPath; //文件网络路径
private String fileName; //文件名称
}
4.文件图片的获取和删除Controller层业务.
RestController
@CrossOrigin
@RequestMapping("/file")
public class FileController {
@Autowired
private FileService fileService; //封装文件service层
@PostMapping("/upload") //新增业务,上传路径
public SysResult uploadFile(MultipartFile file ) throws IOException {
ImageVO imageVO = fileService.uploadFile(file);//接口调用方法获取新增上传结果,由ImageVO 对象接收
if(imageVO == null){ //判断传来的文件是不是空的,如果是空的额,返回失败
return SysResult.fail();
}
return SysResult.success(imageVO);//成功就返回imageVO对象.封装在data里
}
@DeleteMapping("/deleteFile")//删除业务 新增路径
public SysResult deleteFile(String virtualPath){
File file=new File(virtualPath);
file.delete();//删除文件
return SysResult.success();
}
5.yml文件配置,自己设置号存储路径和网络访问虚拟路径
#标识图片上传的路径
file:
#本地存储的跟目录
localDir: D:/image
#网络访问虚拟路径
urlPath: http://image.jt.com
6,FileService 业务实现层,实现具体图片上传.
@Service
public class FileServiceImpl implements FileService{
@Value("${file.localDir}")//动态获取yml里的本地路径和虚拟路径
private String localDir;
@Value("${file.urlPath}") //**spel表达式**
private String urlPath;
/*业务说明
* 是否为图片说明
* 防止恶意程序 木马.exe,jpg
* 重新设定文件名称UUID
* 实现文件上传
* 封装VO对象
* */
@Override
public ImageVO uploadFile(MultipartFile file) { //ImageVO 返回类型
//校验图片类型 jpg\png\gif
String fileName =file.getOriginalFilename();//获取文件名称
fileName=fileName.toLowerCase();//全部转小写
if(!fileName.matches("^.+\\.(jpg|png|gif)$")){//如果不匹配,返回空
//正则表达式.或许用String里的方法, fileName.endsWith()判断是不是以jpg|png|gif结尾也可以.
return null;
}
//2.恶意程序校验, 通过高度,宽度进行判断 强制转成图片
//图片都是有高度和宽度的,如果没有,就不是图片
try { //ImageIO.read专门读取图片 把图片加载到内存中,BufferedImage 图片缓冲区
BufferedImage bufferedImage= ImageIO.read(file.getInputStream());//getInputStream 文件转成输入流形式传输文件
int width=bufferedImage.getWidth(); //实现类BufferedImage 具有调用图片高度,宽度,缩放,图片变灰等效果.
int height= bufferedImage.getHeight();//get,获取高度宽度
if (width==0||height==0){//图片没有高度和宽度,图片文件就是恶意信息.直接返回空,最终返回 fail(),失败
return null;
}
} catch (IOException e) {//文件输入流一般可能有异常,进行捕获.
e.printStackTrace();// 打印异常
return null;// 报错直接返回
}
//3分时间目录存储.有效区分,且安全.将时间格式化
String dateDir=new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
//new Date()获取此时时间.格式化转成特殊格式日期/2021/06/19/
String fileDir= localDir+dateDir;//存储文件目录格式就是fileDir=本地路径(yml)+日期字符串/2021/06/19/
//fileDir=D:/image/2021/06/19/
//判断是否存在.把fileDir字符串路径转成文件格式,判断是否已经有存储过
File dirFile=new File(fileDir);
if (!dirFile.exists()){//如果没有存在过
dirFile.mkdirs() ;//创建多个文件目录存储
}
//4动态生成UUID 防止文件重名
String uuid= UUID.randomUUID().toString().replace("-", "");//唯一字符串.替换-
//获取文件后缀11.jpg
int index= fileName.lastIndexOf('.');//MultipartFile 获取的名字,获取最后一次出现的"."的下标.
String fileType= fileName.substring(index);//包含"."之后的子串
String realFileName= uuid+fileType; //修改图片名称:最终的图片名称=uuid+图片后缀.jpg
//5实现文件上传 文件目录和文件名称
String realFilePath= fileDir+realFileName;//最终的文件存储路径:D:/image/2021/06/19/uuid.jpg
try {
file.transferTo(new File(realFilePath));
//字符串形式的路径转成文件形式路径.MultipartFile 接受的图片文件传输到给定目标路径realFilePath
//6 封装VO路径
ImageVO imageVO=new ImageVO(); //获取对象,通过set方法设置值
//指定文件磁盘地址
imageVO.setVirtualPath(realFilePath);//最终的文件存储地址:realFilePath=D:/image/2021/06/19/uuid.jpg
//指定文件名称
imageVO.setFileName(realFileName);//最终的文件名称:realFileName=uuid+图片后缀.jpg
//设定网路访问路径
String url=urlPath+dateDir+realFileName;//网络虚拟路径http://image.jt.com+/2021/06/19/+uuid+.jpg
imageVO.setUrlPath(url);//设置文件网络路径
return imageVO;//获取所有值后,返回给控制台,在返回给前端.
} catch (IOException e) { //出现异常直接返回空
e.printStackTrace();
return null;
}
}
}