快捷搜索: 王者荣耀 脱发

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()方法判断状态码正常则上传并返回一个可直接访问的外链地址

经验分享 程序员 微信小程序 职场和发展