图片上传后端java实例

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;
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值