阳光沙滩博客系统上传图片方式改为OSS对象存储
一、前言
本来想改为FastDFS+Nginx进行图片上传和预览的,但大锯哥说了FastDFS技术是公司里那些不思进取的老油条才用的,所以为了不做不思进取的老油条,还是改为对象存储吧,哈哈哈哈,不过用完以后真的比FastDFS+Nginx简单多了。这个本来想等前端后端都写完再进行改的,但是我写到前端二十多集的时候因为没有那个js文件卡住了,币又差点,只好提前学习对象存储改代码了,再写文章凑币买资料了[捂脸]
二、准备
- 申请自己的阿里云账号,并开通OSS对象存储服务。
- 在对象存储界面创建存储空间,记住Bucket名称和创建成功后得到的地域节点Endpoint名 等会代码中需要用到。
- 还需要提供AccessKeyId和AccessKeySecret值,点击查看获取AccessKeyId和AccessKeySecret方法 想了解OSS对象存储的可以点击下方链接 点击进入OSS帮助文档
三、开始
1. 导入依赖
        <!--对象存储-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>
2. 添加工具类
- 需要设置的固定值  
- 具体介绍都在代码中
/**
 * 使用OOS上传图片
 */
public class UploadImageUtils {
    /**
     * 上传图片 并获取url地址
     * @param file 上传的图片
     * @param targetPath  拼接好的上传地址和图片名
     *                    只能以字母或数字开头,不可以使用“/”或“\”开头
     * @return url地址
     */
    public static String uploadImage(MultipartFile file, String targetPath){
        try {
            // 1 获取上传需要的固定值
            String endpoint = Constants.OOS.END_POINT;      //你的站点
            String bucketName = Constants.OOS.BUCKET_NAME;		//你的bucket_name 存储空间名称
            String accessKeyId = Constants.OOS.ACCESS_KEY_ID;  //你的acess_key_id
            String accessKeySecret = Constants.OOS.ACCESS_KEY_SECRET; //你的acess_key_secret
            //2 创建OssClient对象
            OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
            //3 获取文件信息,为了上传
            //文件输入流
            InputStream in = file.getInputStream();
            //文件名称
            // meta设置请求头
            ObjectMetadata meta = new ObjectMetadata();
            //必须设置jpg,不然打开地址就是直接下载 不可以预览
            meta.setContentType("image/jpg");
            ossClient.putObject(bucketName, targetPath, in, meta);
            //关闭ossClient
            ossClient.shutdown();
            //返回上传之后地址,拼接地址
            String uploadUrl = "https://"+bucketName+"."+endpoint+"/"+targetPath;
            return uploadUrl;
        }catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
3. 修改业务层上传图片的代码
   /**
     * 上传图片
     * @param file
     * @return
     */
    @Override
    public ResponseResult uploadImage(MultipartFile file) {
        //判断是否有文件
        if (file == null) {
            return ResponseResult.FAILED("图片不可为空");
        }
        //判断文件类型,只支持图片上传,png jpg gif
        String contentType = file.getContentType();
        log.info("contentType == >" + contentType);
        if (TextUtils.isEmpty(contentType)) {
            return ResponseResult.FAILED("图片格式错误");
        }
        //获取相关数据 比如 文件类型 文件名称
        String originalFilename = file.getOriginalFilename();
        log.info("originalFilename ======>>" + originalFilename);
        //判断是否支持该类型
        String type = getType(contentType, originalFilename);
        if (type == null) {
            return ResponseResult.FAILED("不支持此文件类型");
        }
        //限制文件的大小
        long size = file.getSize();
        log.info("maxsize === > " + maxSize + "   size === > " + size);
        if (size > maxSize) {
            return ResponseResult.FAILED("图片最大仅支持" + (maxSize / 1024 / 1024) + "Mb");
        }
        //创建图片的保存目录
        //规则:配置目录/日期/类型/ID.类型
        long currentMillions = System.currentTimeMillis();
        String currentDay = simpleDateFormat.format(currentMillions);
        log.info("current day === > " + currentDay);
        //将图片重新命名
        String targetName = String.valueOf(idWorker.nextId());
        //图片将要保存的路径
        //https://bucketName.oss-cn-beijing.aliyuncs.com/sob_blog_image/2020_08_15/jpg/744262881280786432.jpg
        String targetPath = "sob_blog_image/" + currentDay + "/" + type + "/" + targetName + "." + type;
        //保存文件
        try {
            //获取上传后的路径
            String url = UploadImageUtils.uploadImage(file, targetPath);
            log.info("OOS path === > " + url);
            //保存记录到数据库
            //返回结果,包含这个图片的名称和访问路径
            //1.访问路径
            Map<String, String> result = new HashMap<>();
            String resultPath = currentMillions + "_" + targetName + "." + type;
            result.put("id", resultPath);
            //2.名称---》alt="图片描述"
            result.put("name", originalFilename);
            Image image = new Image();
            image.setContentType(contentType);
            image.setId(targetName);
            Date date = new Date();
            image.setCreateTime(date);
            image.setUpdateTime(date);
            image.setPath(targetPath);
            image.setName(originalFilename);
            image.setUrl(url);
            image.setState("1");
            SobUser sobUser = userService.checkSobUser();
            image.setUserId(sobUser.getId());
            //记录文件
            imageDao.save(image);
            //返回结果
            return ResponseResult.SUCCESS("文件上传成功").setData(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResponseResult.FAILED("图片上传失败");
    }
    /**
     * 判断文件的类型,只支持图片
     * @param contentType
     * @param name
     * @return
     */
    private String getType(String contentType, String name) {
        String type = null;
        if (Constants.ImageType.TYPE_PNG_WITH_PREFIX.equals(contentType)
                && name.endsWith(Constants.ImageType.TYPE_PNG)) {
            type = Constants.ImageType.TYPE_PNG;
        } else if (Constants.ImageType.TYPE_JPG_WITH_PREFIX.equals(contentType)
                && name.endsWith(Constants.ImageType.TYPE_JPG)) {
            type = Constants.ImageType.TYPE_JPG;
        } else if (Constants.ImageType.TYPE_GIF_WITH_PREFIX.equals(contentType)
                && name.endsWith(Constants.ImageType.TYPE_GIF)) {
            type = Constants.ImageType.TYPE_GIF;
        }
        return type;
    }
四、测试
都修改好以后可以进行测试了,下面是已经上传好的。 
看到这里了,不妨留个赞再走吧,嘿嘿嘿。
          本文由
          loneliness
          原创发布于
          阳光沙滩
          ,未经作者授权,禁止转载
        
 




























