阿里云的oss对象存储

阿里云控制台的操作

  1. 首先在阿里云官网开通oss对象存储
  2. 然后创建一个Bucket
  3. 点击文件管理可上传文件
  4. 创建id和秘钥
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

使用方式参考官方文档

https://help.aliyun.com/document_detail/32008.html?spm=5176.208357.1107607.22.754e390fcvGWbV
  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>
  1. 添加配置文件
#服务端口
server.port=8002

#服务名
spring.application.name=service-oss

#环境设置:dev、test、prod
spring.profiles.active=dev

#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.file.keyid=LTAI4GCBSGzKJi
aliyun.oss.file.keysecret=NYH0iN5pZvtEv
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=edu-star

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对于idea没有配置数据库信息启动报错的解决方式
第一种方式 , 添加数据库配置
第二种方式 , 在启动类中添加注解@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
在这里插入图片描述

  1. 创建常量类 , 读取配置文件内容
package com.starcpdk.edu.oss.utils;

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

//当项目启动时 , spring中的接口InitializingBean  , spring加载之后 , 执行接口中的一个方法
@Component
public class ConstantPropertiesUtils implements InitializingBean {
    //读取配置文件内容
    @Value("${aliyun.oss.file.endpoint}")//属性注入
    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 ACCESS_KEY_ID;
    public static String ACCESS_KEY_SECRET;
    public static String BUCKET_NAME;

    @Override
    public void afterPropertiesSet() throws Exception { // 上边的属性注入加载完成之后该方法就会执行
        END_POINT = endpoint;
        ACCESS_KEY_ID = keyId;
        ACCESS_KEY_SECRET = keySecret;
        BUCKET_NAME = bucketName;
    }
}


  1. 添加service 、 controller
    在这里插入图片描述
    OssController
package com.starcpdk.edu.oss.controller;

import com.starcpdk.edu.commonutils.R;
import com.starcpdk.edu.oss.service.OssService;
import com.starcpdk.edu.oss.service.impl.OssServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@CrossOrigin
@Api(value = "oss对象存储")
@RestController
@RequestMapping("/eduoss/fileoss")
public class OssController {

    @Autowired
    private OssService ossService;

    //上传头像的方法
    @ApiOperation(value = "上传头像的方法")
    @PostMapping
    public R uploadOssFile(MultipartFile file){
        //获取上传的文件 , MultipartFile
        //返回上传到OSs的路径
        String url = ossService.uploadFileAvatar(file);

        return R.ok().data("url" , url);
    }
}

OssServiceImpl

package com.starcpdk.edu.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import com.starcpdk.edu.oss.service.OssService;
import com.starcpdk.edu.oss.utils.ConstantPropertiesUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileInputStream;
import java.io.InputStream;

@Service
public class OssServiceImpl implements OssService {
    //上传头像到oss
    @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.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;

        //bucketName的名字
        String bucketName = ConstantPropertiesUtils.BUCKET_NAME;

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

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

            //获取文件的名称
            String fileName = file.getOriginalFilename();

            //调用oss方法实现上传
            //第一个参数  Bucket名称
            //第二个参数  上传到oss文件路径和文件名称    aa/bb/1.jpg
            //第三个参数  上传文件输入流
            ossClient.putObject(bucketName, fileName, inputStream);

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

            //把上传之后的文件路径返回
            //需要把上传到阿里云oss路径手动拼接出来
            String url = "";
            url = "https://" + bucketName + "." + endpoint + "/" + fileName;
            return url;

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

OssService

package com.starcpdk.edu.oss.service;

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

@Service
public interface OssService {
    String uploadFileAvatar(MultipartFile file);
}

存在两个问题

  1. 文件名称重复会造成覆盖
  2. 文件都存在根录下会造成文件很乱

解决方式

  1. 给文件名称加一个随机值
  2. 给文件按日期进行分类

具体实现
为文件名称加一个随机的唯一的字符串拼接到文件名后边 , 使用uuid生成随机的唯一的字符串
在获取文件名称后添加如下代码

            //在文件名称中添加随机唯一值 , uuid生成的值为saasa-sxda-sdas-da , 想去掉- , 用.replace方法将-替换为空字符串
            String uuid = UUID.randomUUID().toString().replace("-" , "");
            //例子为 yuyusxs01.jpg
            fileName = uuid + fileName;

在这里插入图片描述

将文件按照时间分类存储到oss中

在这里插入图片描述

//2. 把文件按照时间进行分类
	//2020/06/29/01.jpg
	//获取当前日期
	//2020/06/29
	String dataPath = new DateTime().toString("yyyy/mm/dd");
	//拼接
	fileName = dataPath + "/" + fileName;

DateTime()类是引入的以下依赖中的类

		<!-- 日期工具栏依赖 -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
        </dependency>

完整的OssServiceImpl类

package com.starcpdk.edu.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import com.starcpdk.edu.oss.service.OssService;
import com.starcpdk.edu.oss.utils.ConstantPropertiesUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Date;
import java.util.UUID;

@Service
public class OssServiceImpl implements OssService {
    //上传头像到oss
    @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.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;

        //bucketName的名字
        String bucketName = ConstantPropertiesUtils.BUCKET_NAME;

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

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

            //获取文件的名称
            String fileName = file.getOriginalFilename();

            //1. 在文件名称中添加随机唯一值 , uuid生成的值为saasa-sxda-sdas-da , 想去掉- , 用.replace方法将-替换为空字符串
            String uuid = UUID.randomUUID().toString().replace("-" , "");
            //例子为 yuyusxs01.jpg
            fileName = uuid + fileName;

            //2. 把文件按照时间进行分类
            //2020/06/29/01.jpg
            //获取当前日期
            //2020/06/29
            String dataPath = new DateTime().toString("yyyy/mm/dd");
            //拼接
            fileName = dataPath + "/" + fileName;

            //调用oss方法实现上传
            //第一个参数  Bucket名称
            //第二个参数  上传到oss文件路径和文件名称    aa/bb/1.jpg
            //第三个参数  上传文件输入流
            ossClient.putObject(bucketName, fileName, inputStream);

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

            //把上传之后的文件路径返回
            //需要把上传到阿里云oss路径手动拼接出来
            String url = "";
            url = "https://" + bucketName + "." + endpoint + "/" + fileName;
            return url;

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot可以通过整合阿里云OSS对象存储服务来实现文件上传和管理功能。具体实现可以参考以下步骤: 1. 在service层定义FileService接口,该接口包含上传文件到阿里云OSS的方法。例如,可以使用MultipartFile作为参数,返回上传成功后的文件URL。 2. 在controller层编写FileApiController类,该类使用@RestController注解标识为控制器,并使用@RequestMapping注解指定请求路径。在该类中,通过@Autowired注入FileService,并在文件上传的接口方法中调用FileService的上传文件方法并返回上传成功后的文件URL。 3. 在配置文件中配置阿里云OSS的相关信息,包括accessKey、secretKey、bucketName等。可以使用SpringBoot提供的@ConfigurationProperties注解来读取配置文件中的信息。 4. 在pom.xml文件中添加阿里云OSS SDK的依赖。 5. 编写上传文件的前端界面,可以使用HTML或者前端框架如Vue.js、React等。 通过以上步骤的实现,SpringBoot就可以整合阿里云OSS对象存储服务,实现文件上传和管理功能。这样可以将文件存储在阿里云OSS中,提高文件的安全性和可靠性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot整合阿里云OSS对象存储服务的实现](https://download.csdn.net/download/weixin_38649091/12721580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [全网最详细SpringBoot、SpringCloud整合阿里云OSS对象存储服务](https://blog.csdn.net/weixin_55076626/article/details/127924003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值