当前位置:主页 > 查看内容

springboot集成oss对象存储服务

发布时间:2021-08-05 00:00| 位朋友查看

简介:springboot集成oss对象存储服务 小白一枚 如若描述有误还请评论区指点痛批 1. 环境准备: 登录阿里云oss对象存储控制台: 传送门 前提环境搭建请参考阿里云oss对象存储官方文档: 传送门 2.创建springboot项目导入 oss相关依赖 !--OSS图片服务器 --dependencygr……

springboot集成oss对象存储服务

  • 小白一枚 如若描述有误还请评论区指点痛批

1. 环境准备:
登录阿里云oss对象存储控制台:传送门
前提环境搭建请参考阿里云oss对象存储官方文档:传送门
2.创建springboot项目导入 oss相关依赖

<!--OSS图片服务器  -->
<dependency>
	<groupId>com.aliyun.oss</groupId>
	<artifactId>aliyun-sdk-oss</artifactId>
	<version>3.10.2</version>
</dependency>

请根据当前版本状况进行调整(博主测试时间:2021/4/18有效)
3.创建application.properties文件并配置

application.properties配置项:

# EndPoint
aliyun.oss.file.endpoint=xxxxxxxxxxxxxxxx
# KeyId
aliyun.oss.file.keyid=xxxxxxxxxxxxxxxxxx
# KeySecret
aliyun.oss.file.keysecret=xxxxxxxxxxxxxxxxxxxxxx
# bucketName
aliyun.oss.file.bucketname=xxxxxxxxxxxxxxxxxx
# # 访问图片的固定前缀
aliyun.oss.file.httpsprefix=xxxxxxxxxxxxxx

如上五个配置如果找不到请看下图:
EndPoint
在这里插入图片描述
KeyId和 KeySecret
在这里插入图片描述
bucketName
在这里插入图片描述
访问图片的固定前缀
在这里插入图片描述

只要相关依赖存在以下代码均可直接copy

3.创建工具类

package com.oss;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class OssConstant implements InitializingBean {
    /** 从配置文件中读取bucketName */
    @Value("${aliyun.oss.file.bucketname}")
    private String bucketName;
    /** 从配置文件中读取存储文件的地址前缀 */
    @Value("${aliyun.oss.file.httpsprefix}")
    private String ossHttpsPrefix;
 
    public static String BUCKET_NAME;
    public static String OSS_HTTPS_PREFIX;
 
    @Override
    public void afterPropertiesSet() throws Exception {
        BUCKET_NAME = bucketName;
        OSS_HTTPS_PREFIX = ossHttpsPrefix;
    }
 
}

4.创建配置类

package com.oss;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;

@Configuration
public class OssConfig {
    /** 从配置文件中读取endPoint */
    @Value("${aliyun.oss.file.endpoint}")
    private String ossEndpoint;
    /** 从配置文件中读取KeyId */
    @Value("${aliyun.oss.file.keyid}")
    private String keyId;
    /** 从配置文件中读取KeySecret */
    @Value("${aliyun.oss.file.keysecret}")
    private String keySecret;
 
    @Bean
    public OSSClient ossClient(){
        return (OSSClient) new OSSClientBuilder().build(ossEndpoint, keyId, keySecret);
    }
}

5.创建Controller

package com.oss;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;

@RestController
@RequestMapping("/oss")
public class OssController {
    @Autowired
    private OSSClient ossClient;
 
    /**
     * 上传图片到OSS
     * @param file 图片文件
     * @return 图片访问地址
     */
    @PostMapping("/upload")
    public String ossUpload(MultipartFile file){
    	System.out.println("文件上传"+file);
        // 获取原始文件名(我一般都是用UUID生成新的文件名)
        String fileName = file.getOriginalFilename();
        // 文件夹名(可以用模块名)
        String folder = "liuchengyin";
        // 文件夹名(根据日期来存储)
        String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        // 文件名 - 使用UUID生成
        String fileNameUUID = UUID.randomUUID().toString().replaceAll("-", "");
        if (fileName != null){
            // 获取原始文件名的后缀,如.jpg .png
            fileNameUUID = folder+ "/" + format + "/" + fileNameUUID + fileName.substring(fileName.lastIndexOf("."));
        } else {
            // 一般来说这种情况是不存在的
            fileNameUUID = folder+ "/" + format + "/" + fileNameUUID + ".jpg";
        }
        try {
            ossClient.putObject(OssConstant.BUCKET_NAME, fileNameUUID, file.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 返回文件访问地址 - 这里可以封装一个对象,返回访问地址和文件名(也就是fileNameUUID)
        // 这个文件名(fileNameUUID)可以用于查询是否存在、删除等操作
        return OssConstant.OSS_HTTPS_PREFIX + "/" + fileNameUUID;
    }
 
    /**
     * 删除OSS里的文件/文件夹(文件夹内不能有文件)
     * @param fileName 文件名 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
     * @return
     */
    @PostMapping("/delete")
    public String ossDelete(String fileName){
        ossClient.deleteObject(OssConstant.BUCKET_NAME, fileName);
        return "删除成功!";
    }
 
    /**
     * 批量删除OSS里的文件
     * @param fileNames 文件名集合 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
     * @return
     */
    @PostMapping("/deleteBatch")
    public List<String> ossDeleteBatch(@RequestBody List<String> fileNames){
        DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(OssConstant.BUCKET_NAME).withKeys(fileNames));
        // 返回的就是删除成功的图片名集合(图片不存在,也会返回)
        return deleteObjectsResult.getDeletedObjects();
    }
 
    /**
     * 查询OSS里的文件是否存在
     * @param fileName 文件名 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
     * @return 是否存在:true or false
     */
    @GetMapping("/exist")
    public Boolean isExist(String fileName) {
        return ossClient.doesObjectExist(OssConstant.BUCKET_NAME, fileName);
    }
}

更多需求可以参考阿里云 oss官方api:传送门

拿到图片访问url后如果不能访问请设置如下:
在这里插入图片描述
访问链接为: https:// 拿到的链接
举例:https://xiaoou1.oss-cn-beijing.aliyuncs.com/liuchengyin/2021-04-18/bd95d88734af43b0b90e5879fe451bf4.jpg
注释:根据oss文档规定通过文件URL访问图片时,默认是下载行为,因为博主很穷只有一个域名 所以暂时没有绑定 所以您在访问时默认是下载图片的行为而不是在线预览 如果你有html基础你可以使用img标签来展示图片
注释:
这里详情请看官方文档

访问控制(Resource Access Management,RAM)是阿里云提供的一项管理用户身份与资源访问权限的服务。使用
RAM,您可以创建、管理 RAM 子用户(例如员工、系统或应用程序),并可以控制这些 RAM
子用户对资源的操作权限。当您的企业存在多用户协同操作资源时,使用 RAM
可以让您避免与其他用户共享云账号密钥,按需为用户分配最小权限,从而降低企业信息安全风险。 了解 访问控制 RAM 产品。

博主之前填写的是阿里云 API 的密钥 但是官方是非常建议大家填写子用户的密钥
在这里插入图片描述
传送门:RAM访问控制台
创建用户并为用户赋予权限
此时注意注意注意 !!!!!!!!!!!!!!!!!!!!
此时注意注意注意 !!!!!!!!!!!!!!!!!!!!
此时注意注意注意 !!!!!!!!!!!!!!!!!!!!
使用子用户的KeyId和KeySecret要注意当你创建完成后它会提示你在你创建的时候显示一次之后不做显示 而此时你就要妥善保管如果丢失则重新创建一次

;原文链接:https://blog.csdn.net/XiaoOu7/article/details/115835041
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐