阿里云OOS文件服务器

用户认证需要上传证件图片,因此我们要做文件服务,为了解决海量数据存储与弹性扩容,项目中我们采用云存储的解决方案:阿里云OSS。

阿里云OSS SDK文档 :  https://help.aliyun.com/document_detail/32016.html

准备工作

开通“对象存储OSS”服务

(1)申请阿里云账号

(2)实名认证

(3)开通“对象存储OSS”服务

(4)进入管理控制台

注册登录阿里云

(1)实名认证

(2)找到开通云服务

(3)创建Bucket(为Bucket起一个名字,其余选项默认即可)

(4)得到endpoint:创建Bucket后,在概览页面可以获取当前Bucket的endpoint值,这个值后面编程的时候会用到

使用RAM子用户

进入子用户管理页面(AccessKEy管理)

添加用户 ---开启OpenAPI调用访问---获取子用户Id和key(一定一定要复制下来AccessKeyId, AccessKeySecret)---设置用户权限---AliyunOSSFullAccess

开始:

项目中引入aliyun-sdk-oss依赖

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

配置文件

aliyun:
  oss: #阿里云 OSS
    endpoint:  #地域节点(域名)
    key-id: # AccessKey
    key-secret: 
    bucket-name:  #桶名称

创建一个配置类,用于读取配置文件

@Configuration //标记当前类是一个配置类
@ConfigurationProperties(prefix = "aliyun.oss") //扫描配置文件 prefix前缀
@Data
public class OssConstantProperties {
    private String endpoint;
    private String keyId;
    private String keySecret;
    private String bucketName;
}

项目使用oss上传文件

    public Map<String, String> upload(MultipartFile file) {
//        拿到keyId
        String keyId = oosConstantProperties.getKeyId();
//        拿到keySecret
        String keySecret = oosConstantProperties.getKeySecret();
//        拿到地域节点
        String endpoint = oosConstantProperties.getEndpoint();
//        拿到数据桶名称
        String bucketName = oosConstantProperties.getBucketName();


        try {
//          获取文件名
            String filename = file.getOriginalFilename();
//            生成uuid
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            String dateTime = new DateTime().toString("yyyyMMdd");
//          重新拼接文件名,避免文件重复产生冲突
            String resultName = dateTime + "/" + uuid + filename.substring(filename.lastIndexOf("."));

//          获取媒体文件输入流
            InputStream inputStream = file.getInputStream();

            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, keyId, keySecret);


            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, resultName, inputStream);
//          设置此属性可以返回response,如果不设置,response为空
            putObjectRequest.setProcess("true");

//          使用oss客户端,发送请求并获取结果
            PutObjectResult result = ossClient.putObject(putObjectRequest);
//          判断响应码是否正常
            if (result.getResponse().getStatusCode() != 200) {
                throw new RuntimeException("上传出错");
            }

//            使用客户端方法,获取临时访问url
//            设置签名url过期时间,将在一小时后过期 单位:ms
            Date expiration = new Date(new Date().getTime() + 3600 * 1000L);

            // 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。方便认证成功后浏览器可以直接展示
            URL url = ossClient.generatePresignedUrl(bucketName, resultName, expiration);

            System.out.println("url:" + url);

//            封装数据
            Map<String, String> map = new HashMap<>();
            map.put("previewUrl", url.toString());
            map.put("url", resultName);

            return map;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

注意(坑): 

如果想要根据响应码判断是否上传成功,必须设置

//          设置此属性可以返回response,如果不设置,response为空
            putObjectRequest.setProcess("true");

否则 result.getResponse() 会为空,导致出现异常

swagger测试上传功能

 

登录控制台查看上传的文件

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值