Java实现头像上传

#Java实现头像上传

看网课的时候视频中用到下方的路径
== String realPath = session.getServletContext().getRealPath(“/upload”);==

这样会导致一个问题,就是每次服务器重启之后,这个文件就会找不到,不过也不用担心,在企业里如果文件很多就会有专门的文件服务器,写ip地址加文件名字就行,自己解决这个bug的话,我用到的是写在本地文件中,下面开始代码环节

首先要写一个配置类,因为大多数浏览器为了安全不允许访问你的本地文件,所以写一个映射路径,这段代码的意思就是一个拦截器,只要访问addResourceHandler(“xxx”)这个路径就会映射到addResourceLocations(“mmm”)这个真实路径

public static  final int AVATAR_MAX_SIZE =10 *1024*1024; //设置上传文件的最大值

    public static final List<String> AVATAR_TYPE = new ArrayList<>();    //限制上传文件的类型
    static {

        AVATAR_TYPE.add("image/jpeg");
        AVATAR_TYPE.add("image/png");
        AVATAR_TYPE.add("image/bmp");
        AVATAR_TYPE.add("image/gif");
        AVATAR_TYPE.add("image/webp");

    }

//上面是无关的东西

//在这里我写在了控制层,可以传参到业务层写,JsonResult<>是模型类

    public JsonResult<String> updateUserAvatar (HttpSession session, MultipartFile file){

        if (!AVATAR_TYPE.contains(file.getContentType())){  //这些是抛出的异常可以不用管,但是也会介绍一下,file是上面的形参
            throw new FileTypeException();                  // 文件类型不符异常
        }
        if (file==null){
            throw new FileEmptyException();                 //文件空异常,如果文件是个空,扔出去
        }
        if (file.getSize()>AVATAR_MAX_SIZE){
            throw new FileSizeException();                   //文件大小异常
        }
//第一步::写一个路径,和配置类一样
        String realPath =
                "C:/Users/32189/Desktop/壁纸/test/0/";       // 随便写一个路径,但是需要和配置类中一样,注意 / 符号别漏
//                session.getServletContext().getRealPath("/upload"); 之前的路径
//第二步::用文件检测目录,没有就创建
        File dir = new File(realPath);                       //在这个路径下创建一个文件
        if (!dir.exists()){ //检测目录是否存在                   //如果这个文件不存在(目录不存在自然就创建不了文件),用文件指向目录,常用手段
            dir.mkdirs(); //创建目录                           //创建这个目录
        }
//第三步::统一后缀名
        String originalFilename = file.getOriginalFilename(); //获取传过来的文件的原来的名字
        int i =                                               //lastIndexOf(“ . ”),返回某个字符(串)在一个长的字符串中最后出现的位置
                originalFilename.lastIndexOf(".");        //在这里是获取后缀名那个点(.png)中点的下标
        
        String png =                                          //substring(i),是获取从下标i开始到最后的字符串,包括i,例如(.png)
                originalFilename.substring(i);                //substring(i,i+2)也有两个参数的用法,获取第i个和第i+2个之间的字符串
        
        String filename =                                     //随机生成一个名字加上后缀
                UUID.randomUUID().toString().toUpperCase()+png; //为什么随机生成一个名字呢,因为大部分企业都这么做,如果两个用户上传两个名字一样的会覆盖(UUID是生成随机字符串的一个类,toUpperCase()是字母全部大写)
//第四步::在该目录下创建一个空白文件,文件名字随意
        File dest = new File(dir,filename);                  //在这个目录下创建一个空白的文件
//第五步::把形参的文件数据用提供的api写入到空白文件中        
        try {
            file.transferTo(dest);//java提供了一个api,底层还是io流,需要保证后缀一致  //将file中的数据写入到这个空文件中
        } catch (IOException e) {
            throw  new FileuploadIOException();
        }
//第六步::拼接完整地址 目录加文件名字        
        String avatar ="/test/"+filename;                    //返回配置类映射路径+文件名字 变量avatar是往数据库存放的地址,也是返回前端的数据,直接可用

希望可以帮助需要的人