Springboot项目中图片云存储实现思路
首先,这不是一个完成的搭建项目图床的文章;这是我面试过程中遇到的一个问题,总结一下并在此记录。
上次面试面试官问我项目中如何实现云存储的,我简略回答是通过文件流转换为base64格式然后上传到七牛云空间,被追问中间流的具体变化没答上来,这场面试挂掉虽然应不只是因为这个问题,但这个问题导致面试官认为我的项目不是自己完成的。
conroller类中调用到图片上传的类
@PostMapping("/personal") public String personal(HttpSession session, String name, String introduction, @RequestParam("file") MultipartFile file) throws IOException { String path = null; // 获取文件的名称 String fileName = file.getOriginalFilename(); // 使用工具类根据上传文件生成唯一图片名称 String imgName = UUID.randomUUID().toString() + fileName; if (!file.isEmpty()) { FileInputStream inputStream = (FileInputStream) file.getInputStream(); path = QiNiuUtil.uploadQNImg(inputStream, imgName); System.out.print("七牛云返回的图片链接:" + path); } User user = (User) session.getAttribute("user"); user.setName(name); if (path != null) { user.setAvatar(path); } user.setIntroduction(introduction); userMapper.updateById(user); return "redirect:/manage?uid=" + user.getId(); }
简单说:通过使用SpringMVC 类包类中getInputStream()方法读取返回文件流赋值给inputStream对象 (通过类包java.io中FileInputStream 新建的);然后调用QiNiuUtil.uploadQNImg(inputStream, imgName)七牛工具类以字节流形式上传图片文件,并返回可以直链访问云存储的图片地址 FileInputStream 创建对象这个过程比较复杂有点看不懂,有看的懂的大佬请指点一二;
注意:首先,这个流转换要明晰 是SpringMVC类包
图片名定义:通过package org.springframework.web.multipart类调用 getOriginalFilename() 获取文件名,而后通过 UUID.randomUUID() 生成16位唯一随机码然后拼接文件名生成新的图片名称用于上传
上传:通过 isEmpty() 判断图片是否为空,为空的话返回false不进行上传;通过 getInputStream() (依旧是multipart类中方法) 获取字节流赋值给通过 java.io.FileOutputStream 创建的 inputStream 对象并调用QiNiuUtil.uploadQNImg() 进行图片上传操作
package org.springframework.web.multipart;
java.io.File
QiNiuUtil(控制上传)
这里只粘贴了uploadQNImg这个方法,具体的七牛配置类可以网上搜 这里贴一个参考吧:
public static String uploadQNImg(FileInputStream file, String key) { // 构造一个带指定Zone对象的配置类, 注意这里的Zone.zone0需要根据主机选择 UploadManager uploadManager = new UploadManager(new Configuration(Zone.zone1())); Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY ); // 根据命名空间生成的上传token String path=null; String token = auth.uploadToken(BUCKETNAME); try{ // 上传图片文件 Response res = uploadManager.put(file, key, token, null, null); if (!res.isOK()) { throw new RuntimeException("上传七牛出错:" + res.toString()); } // 解析上传成功的结果 DefaultPutRet putRet = new Gson().fromJson(res.bodyString(), DefaultPutRet.class); path = DOMAIN + "/" + putRet.key; // 这个returnPath是获得到的外链地址,通过这个地址可以直接打开图片 }catch (QiniuException e){ e.printStackTrace(); } return "http://"+path; }
获取FileInputStream 创建的file 然后以 七牛的配置类生成对象存放file以及key值等信息
上传前通过isOK()方法判断状态码正常则上传并返回一个可直接访问的外链地址