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是往数据库存放的地址,也是返回前端的数据,直接可用
希望可以帮助需要的人