阿里云的OSS服务进行文件存储

实现步骤:

1). 定义OSS相关配置

在sky-server模块

application-dev.yml

 sky:
   alioss:
     endpoint: oss-cn-hangzhou.aliyuncs.com
     access-key-id: LTAI5tPeFLzsPPT8gG3LPW64
     access-key-secret: U6k1brOZ8gaOIXv3nXbulGTUzy6Pd7
     bucket-name: sky-take-out

application.yml

 spring:
   profiles:
     active: dev    #设置环境
 sky:
   alioss:
     endpoint: ${sky.alioss.endpoint}
     access-key-id: ${sky.alioss.access-key-id}
     access-key-secret: ${sky.alioss.access-key-secret}
     bucket-name: ${sky.alioss.bucket-name}
 ​

2). 读取OSS配置

在sky-common模块中,已定义

 package com.sky.properties;
 ​
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
 ​
 @Component
 @ConfigurationProperties(prefix = "sky.alioss")
 @Data
 public class AliOssProperties {
 ​
     private String endpoint;
     private String accessKeyId;
     private String accessKeySecret;
     private String bucketName;
 ​
 }

3). 生成OSS工具类对象

在sky-server模块

 package com.sky.config;
 ​
 import com.sky.properties.AliOssProperties;
 import com.sky.utils.AliOssUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 ​
 /**
  * 配置类,用于创建AliOssUtil对象
  */
 @Configuration
 @Slf4j
 public class OssConfiguration {
 ​
     @Bean
     @ConditionalOnMissingBean
     public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){
         log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);
         return new AliOssUtil(aliOssProperties.getEndpoint(),
                 aliOssProperties.getAccessKeyId(),
                 aliOssProperties.getAccessKeySecret(),
                 aliOssProperties.getBucketName());
     }
 }

其中,AliOssUtil.java已在sky-common模块中定义

 package com.sky.utils;
 ​
 import com.aliyun.oss.ClientException;
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClientBuilder;
 import com.aliyun.oss.OSSException;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import java.io.ByteArrayInputStream;
 ​
 @Data
 @AllArgsConstructor
 @Slf4j
 public class AliOssUtil {
 ​
     private String endpoint;
     private String accessKeyId;
     private String accessKeySecret;
     private String bucketName;
 ​
     /**
      * 文件上传
      *
      * @param bytes
      * @param objectName
      * @return
      */
     public String upload(byte[] bytes, String objectName) {
 ​
         // 创建OSSClient实例。
         OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
 ​
         try {
             // 创建PutObject请求。
             ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
         } 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());
         } finally {
             if (ossClient != null) {
                 ossClient.shutdown();
             }
         }
 ​
         //文件访问路径规则 https://BucketName.Endpoint/ObjectName
         StringBuilder stringBuilder = new StringBuilder("https://");
         stringBuilder
                 .append(bucketName)
                 .append(".")
                 .append(endpoint)
                 .append("/")
                 .append(objectName);
 ​
         log.info("文件上传到:{}", stringBuilder.toString());
 ​
         return stringBuilder.toString();
     }
 }

4). 定义文件上传接口

在sky-server模块中定义接口

 package com.sky.controller.admin;
 ​
 import com.sky.constant.MessageConstant;
 import com.sky.result.Result;
 import com.sky.utils.AliOssUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 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;
 import java.io.IOException;
 import java.util.UUID;
 ​
 /**
  * 通用接口
  */
 @RestController
 @RequestMapping("/admin/common")
 @Api(tags = "通用接口")
 @Slf4j
 public class CommonController {
 ​
     @Autowired
     private AliOssUtil aliOssUtil;
 ​
     /**
      * 文件上传
      * @param file
      * @return
      */
     @PostMapping("/upload")
     @ApiOperation("文件上传")
     public Result<String> upload(MultipartFile file){
         log.info("文件上传:{}",file);
 ​
         try {
             //原始文件名
             String originalFilename = file.getOriginalFilename();
             //截取原始文件名的后缀   dfdfdf.png
             String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
             //构造新文件名称
             String objectName = UUID.randomUUID().toString() + extension;
 ​
             //文件的请求路径
             String filePath = aliOssUtil.upload(file.getBytes(), objectName);
             return Result.success(filePath);
         } catch (IOException e) {
             log.error("文件上传失败:{}", e);
         }
 ​
         return Result.error(MessageConstant.UPLOAD_FAILED);
     }
 }
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值