【MoodVine】Cloudflare R2对象存储使用

Cloudflare R2 定价情况

官方定价说明

cloudflare R2对象存储每个月提供10GB的免费额度,对于个人开发者足够使用,接下来开始配置

配置

  1. 配置支付方式

    此处正常填写信息即可,如果没有信用卡,可以使用paypal(绑定普通银行卡)

  2. 创建存储桶

  3. 使用自定义域访问

    填写自定义域,点击连接域后,Cloudflare会自动为我们已经托管在其上的域名添加DNS记录

Java工具类

  1. 引入Maven依赖

    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>s3</artifactId>
        <version>2.27.13</version>
    </dependency>
    
  2. 工具类实现如下

    package org.example.moodvine_backend.utils;
    
    import org.springframework.beans.factory.annotation.Value;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    import org.springframework.web.multipart.MultipartFile;
    import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
    import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
    import software.amazon.awssdk.regions.Region;
    import software.amazon.awssdk.services.s3.S3Client;
    import software.amazon.awssdk.services.s3.model.PutObjectRequest;
    import software.amazon.awssdk.services.s3.model.PutObjectResponse;
    
    import java.io.IOException;
    import java.net.URI;
    
    @Slf4j
    @Component
    public class R2Utils {
    
        // 加载配置
        @Value("${R2.access-key-id}")
        String accessKeyId;
    
        @Value("${R2.secret-access-key}")
        String secretAccessKey;
    
        @Value("${R2.end-point}")
        String endpoint;
    
        @Value("${R2.bucket-name}")
        String bucketName;
    
        public String uploadFile(MultipartFile file) throws IOException {
            // 创建S3客户端
            S3Client s3 = S3Client.builder()
                    .endpointOverride(URI.create(endpoint))
                    .region(Region.US_EAST_1)  // Cloudflare R2区域(选择合适的区域)
                    .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKeyId, secretAccessKey)))
                    .build();
    
            // 上传文件
            PutObjectRequest putObjectRequest = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(file.getOriginalFilename())
                    .build();
    
            PutObjectResponse response = s3.putObject(
                    putObjectRequest,
                    software.amazon.awssdk.core.sync.RequestBody.fromBytes(file.getBytes())
            );
            log.info("File uploaded successfully: {}" , response.eTag());
    
            // 关闭S3客户端
            s3.close();
            // 拼接URL
            String url = "<https://img.rainnn.top/>"+file.getOriginalFilename();
            return url;
        }
    }
    
    
  3. 创建API令牌

  4. 获取access-key-idsecret-access-keyend-pointbucket-name

    前三个在创建好API令牌后可以轻松获取,bucket-name是前面创建的令牌桶的名字

  5. application.yml 中添加配置

    R2:
      access-key-id: 
      secret-access-key: 
      end-point: https:
      bucket-name: 
    
  6. 编写接口测试工具类

    接口如下:

    @RequestMapping("/file")
    @RestController
    public class FileController {
    
        @Autowired
        FileService fileService;
    
        @PostMapping("/upload")
        public ResponseData upload(MultipartFile file) {
            return fileService.upload(file);
        }
    }
    
    @Service
    public class FileService {
    
        @Autowired
        R2Utils r2Utils;
    
        public ResponseData upload(MultipartFile file) {
            try {
                String url = r2Utils.uploadFile(file);
                return new ResponseData(200, url, "File uploaded successfully");
            } catch (IOException e) {
                return new ResponseData(500, null, "Failed to upload file: " + e.getMessage());
            }
        }
    }
    
  7. 使用Apifox测试接口

返回链接经检验是所上传图片,成功!后续需要添加图片、视频、音频格式判断及压缩等代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值