JAVA整合对象存储OSS完成图片上传

1、创建一个Bucket

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6OHpNdUr-1607310143298)(C:\Users\acer\AppData\Roaming\Typora\typora-user-images\image-20201207095426739.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L2M0wjiq-1607310143308)(C:\Users\acer\AppData\Roaming\Typora\typora-user-images\image-20201207095847756.png)]

2、创建一个Access key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LIhehMvb-1607310143312)(C:\Users\acer\AppData\Roaming\Typora\typora-user-images\image-20201207100942735.png)]

3、开发文档

https://help.aliyun.com/document_detail/32012.html?spm=a2c4g.11186623.6.924.610d6e1dtkI1dL

以下是开发需要使用的key:
在这里插入图片描述
在这里插入图片描述

Springboot整合OSS

1、导入依赖

<dependencies>
     <!-- 阿里云oss依赖 -->
     <dependency>
         <groupId>com.aliyun.oss</groupId>
         <artifactId>aliyun-sdk-oss</artifactId>
     </dependency>
     <!-- 日期工具栏依赖 -->
     <dependency>
         <groupId>joda-time</groupId>
         <artifactId>joda-time</artifactId>
     </dependency>
</dependencies>

2、配置文件

#服务端口
server.port=port
#服务名
spring.application.name=service-oss
#环境设置:dev、test、prod
spring.profiles.active=dev
#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=your endpoint
aliyun.oss.file.keyid=your accessKeyId
aliyun.oss.file.keysecret=your accessKeySecret
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=edu-school-cyrus

3、创建一个工具类获取oss中的配置

/**
 * 读取配置文件中的内容
 * 当spring加载后,执行接口的一个方法
 */
@Component
public class ConstantPropertiesUtils implements InitializingBean {

    @Value("${aliyun.oss.file.endpoin}")
    private String endpoint;

    @Value("${aliyun.oss.file.keyid}")
    private String keyId;

    @Value("${aliyun.oss.file.keysecret}")
    private String keySecret;

    @Value("${aliyun.oss.file.bucketname}")
    private String bucketName;

    /**
     * 定义对应的静态变量
     */
    public static String END_POINT;
    public static String KEY_ID;
    public static String KEY_SECRET;
    public static String BUCKET_NAME;
    /**
     * 当上面的属性初始化后开始执行
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        //属性初始化后给相对应的静态变量赋值
        END_POINT = endpoint;
        KEY_ID = keyId;
        KEY_SECRET = keySecret;
        BUCKET_NAME = bucketName;
    }
}

4、Controller层

@RestController
@RequestMapping("/eduoss/fileoss")
public class OssController {
    
    @Autowired
    private OssService ossService;
    
    //上传头像
    @PostMapping
    public R uploadOssFile(MultipartFile file) {
        //获取上传文件,用MultipartFile格式接收
        //返回上传的oss路径
        String url = ossService.uploadFileAvatar(file);
        
        return R.ok().data("url",url);
    }
}

5、Service实现类

@Service
public class OssServiceImpl implements OssService {
    @Override
    public String uploadFileAvatar(MultipartFile file) {
        // Endpoint以杭州为例,其它Region请按实际情况填写。
        String endpoint = ConstantPropertiesUtils.END_POINT;
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
        String accessKeyId = ConstantPropertiesUtils.KEY_ID;
        String accessKeySecret =ConstantPropertiesUtils.KEY_SECRET;
        String bucketName = ConstantPropertiesUtils.BUCKET_NAME;


        try {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

            // 上传文件流。
            InputStream inputStream = file.getInputStream();

            //获取全路径
            String filename = file.getOriginalFilename();

            //在文件名称中添加随机唯一值
            String uuid = UUID.randomUUID().toString().replaceAll("-","");
            filename = uuid + filename;

            //在OSS中按时间日期进行分类文件夹存储
            String dataPath = new DateTime().toString("yyyy/MM/dd"); //工具类
            filename = dataPath +"/"+ filename;

            /**
             * <yourBucketName>:bucket名称
             * <yourObjectName>:上传到oss文件路径和文件名称  =》 /a/1.jpg
             */
            ossClient.putObject(bucketName, filename, inputStream);

            // 关闭OSSClient。
            ossClient.shutdown();

            /**
             * 把上传之后的文件路径返回,自行拼接
             * https://edu-school-cyrus.oss-cn-beijing.aliyuncs.com/A1F0EB0519EF22686F68E2E5E5D0C6C7.jpg
             */
            String url = "https://"+bucketName+"."+endpoint+"/"+filename;
            return url;

        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

存在问题:

1、可能存在上传同一文件名会默认进行覆盖

  • 文件名加上随机值
//在文件名称中添加随机唯一值
String uuid = UUID.randomUUID().toString().replaceAll("-","");
filename = uuid + filename;

2、把文件进行分类管理

  • 按时间
  • 按名称
String dataPath = new DateTime().toString("yyyy/MM/dd"); //工具类
filename = dataPath +"/"+ filename;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值