SpringBoot结合阿里云OSS实现图片或文件接口

1、任务描述

使用SpringBoot结合阿里云的SDK,完成一个能够接受用户上传的图片或文件,并返回存储路径的接口。

2、前提

需要先开启阿里云的oss服务,并且申请用户访问凭证、创建存储空间。

3、实现步骤

1、导入SpringBoot依赖

 <!--      阿里oss-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.15.1</version>
        </dependency>

2、将所需的变量写到配置文件中

aliyunoss:
  accessKeyId: 省略
  accessKeySecret: 省略
  endpoint: 省略
  bucketName: 省略

3、创建配置类。

这里主要为了将后面经常使用的OSS对象进行初始化。熟练之后也可自行封装工具类。

@Configuration
@Slf4j
@Data
public class AliyunOssConfig {
    //Ram用户访问的密钥---配置访问凭证
     @Value("${aliyunoss.accessKeyId}")
     public   String accessKeyId;
     @Value("${aliyunoss.accessKeySecret}")
     public  String accessKeySecret;
     //Bucket所在地域对应的Endpoint--创建OSSClient实例
     @Value("${aliyunoss.endpoint}")
    public  String endpoint;
    //Bucket名称--存储空间
    @Value("${aliyunoss.bucketName}")
    public  String bucketName;



    //配置访问凭证(这里用长期的方式)
    private CredentialsProvider createCredentialsProvider(){
        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
        log.info("初始化登录凭证成功,参数如下");
        log.info("accessKeyId:"+accessKeyId);
        log.info("accessKeySecret:"+accessKeySecret);
        return credentialsProvider;
    }

    //创建ossclient客户端
    @Bean
    public OSS ossclientInit(){

        OSS ossClient = new OSSClientBuilder().build(endpoint,createCredentialsProvider());
        log.info("阿里云oss客户端初始化完成");
        return ossClient;


    }



}

4、编写接口

解析:

在阿里云的SDK中,可以看到核心的代码为下图所示。

第一步为:创建PutObjectRequest对象,这里传递的参数依次是存储空间名称(bucketName)、上传到oss下的完整路径(objectName),即文件路径+文件名、文件输入流(inputStream),这个是要上传的文件转换成流对象。

第二步为:使用OSS对象发起调用。这个对象在前面配置类中已经初始化并注入Spring容器中了,需要时可以直接注入。

最后要返回的是文件url,阿里云调用完的结果对象并没有返回对应存储的url,这里自己手动封装。格式为: https://+bucketName+endpoint+文件路径+文件名

代码实现:

@RestController
@RequestMapping
public class FileController {
    @Autowired
    private OSS ossClient;
    // Bucket名称。
    @Value("${aliyunoss.bucketName}")
    private   String bucketName ;
    //Bucket所在地域对应的Endpoint--创建OSSClient实例
    @Value("${aliyunoss.endpoint}")
    public  String endpoint;

    @RequestMapping()
    public String testController(MultipartFile file){
        if(file != null){
        try {
            //由于阿里云需要的SDK需要的是File类型,所以需要将接受的File类型转换成File
            String newfileName="D://"+file.getOriginalFilename();
            File newfile=new File(newfileName);
            file.transferTo(newfile);
            //创建文件输入流
            InputStream inputStream = new FileInputStream(newfile);
            // 创建PutObjectRequest对象。
            // 这里的saveUrl包含保存的路径名+文件名
            String saveUrl="test/"+file.getOriginalFilename();
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,saveUrl, inputStream);
            // 创建PutObject请求。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            System.out.println("请求的返回结果是"+result);
            //封装返回结果
            return "https://"+bucketName+"."+endpoint+"/"+saveUrl;
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        }
        return "error";
    }
}

4、结果

用swagger即可测试该接口。

可以看到成功返回了上传的文件路径,通过该路径就可以访问到对应图片或文件了。

在对应的阿里云控制台也能看到上传的图片

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值