白嫖对象存储10T空间。下载免费—S3对接

Cloudflare R2 Storage允许开发人员存储大量非结构化数据,而无需支付与典型云存储服务相关的昂贵出口带宽费用。高性能的文件和对象存储,无输出费用。官网:https://dash.cloudflare.com/

准备材料

一张visa卡需要绑定卡,实名信息等。

应用场景

您可以将R2用于多种场景,包括但不限于:
云原生应用程序的存储
web内容的云存储
播客集的存储
数据湖(分析和大数据)
用于大批量处理的云存储输出,如机器学习模型工件或数据集

开始对接

(1)需要的信息 .xml
#地址
endpoint=https://abddf25182f42dd05d9b1.r2.cloudflarestorage.com
#地域
region=auto
#桶名
bucketname=usermi
#自定义域名
cdn_domain=https://inde.com
#id
access_key=e16c6db4d77a095f992f97
#key
secret_key=57afa8ca7ce687f31de19f0e948557405afe0f7fb6e288f6d2c20
以上信息后面有教程在哪里找

示例demo

(1) maven引用

  <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>endpoints-spi</artifactId>
            <version>2.29.52</version>
<!--            <version>2.32.26</version>-->
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
            <version>2.29.52</version>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>ec2</artifactId>
            <version>2.29.52</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
            <version>1.12.445</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.10</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>

(2)上传下载工具

import com.bogo.boot.file.api.vo.UploadSignVO;
import com.bogo.boot.message.exception.ChatForbiddenException;
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpMethod;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.*;

import java.io.*;
import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;


@Log
@Component
public class R2OssUtils {

    @Value("${bogo.aws.r2.endpoint}")
    private String END_POINT;
    @Value("${bogo.aws.r2.region}")
    private String REGION;
    @Value("${bogo.aws.r2.bucketname}")
    private String BUCKET_NAME;
    @Value("${bogo.aws.r2.cdn_domain}")
    private String CDN_DOMAIN;
    @Value("${bogo.aws.r2.access_key}")
    private String ACCESS_KEY;
    @Value("${bogo.aws.r2.secret_key}")
    private String SECRET_KEY;

    @Value("${bogo.aws.r2.robackAddress}")
    private String robackAddress;

    public static void main(String[] args) {
        String imagePath = "C:\\Users\\AAAA\\Desktop\\aaa\\1111.png";
        try{
//           System.out.println(upload(convert(imagePath)));

        }catch (Exception e){
            System.out.println("失败:"+e);
        }
    }


    /**
     * 文件地址  文件路径格式
     * @param imagePath
     * @return  下载地址
     * @throws IOException
     */
    public String uploadPath(String imagePath,String bucketpath,String name){
        try {
            return upload(convert(imagePath),bucketpath,name);
        }catch (Exception e){
            throw new ChatForbiddenException("文件上传失败"+e.getMessage());
        }
    }

    /**
     * 文件上传
     * @param file  文件
     * @param bucketpath 桶子目录
     * @return
     */
    public String uploadFile(MultipartFile file,String bucketpath,String name){
        try {
            return upload(file,bucketpath,name);
        }catch (Exception e){
            throw new ChatForbiddenException("文件上传失败"+e.getMessage());
        }
    }


    public String upload(MultipartFile file,String bucketpath,String name) throws IOException {
        //使用try-with, S3Client在使用完毕后需要自动关闭
        try(InputStream inputStream = file.getInputStream();
            S3Client client = S3Client.builder()
                    .endpointOverride(URI.create(END_POINT))    //访问端点
                    .credentialsProvider(() -> AwsBasicCredentials.create(ACCESS_KEY, SECRET_KEY))  //访问凭证
                    .region(Region.of(REGION))  //地区
                    .overrideConfiguration(b -> b
                            .putHeader("X-Amz-Date", AWS_DATE_FORMATTER.format(Instant.now()))
                            )
                    .build()) {
            //获取当前日期, 利用当前日期构建对象键的路径, 如2025/05/27
            //实际路径可根据开发情况修改
//            String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
            //获取文件扩展名
            //获取上传文件的原始文件名, 即包含扩展名
            String originalFilename = file.getOriginalFilename();
            assert originalFilename != null;
            //获取源文件扩展名
            String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
            //构建对象键, 包含日期路径、使用UUID随机生成的文件名
            //实际文件名可根据开发情况修改
//            String objectKey = date + "/" + UUID.randomUUID() + fileExtension;
            String objectKey = bucketpath + "/" + name;
            PutObjectRequest putObjectRequest = PutObjectRequest.builder()
                    .bucket(BUCKET_NAME)    //设置存储桶名称
                    .key(objectKey)     //设置对象键
                    .build();
            //使用S3Client将文件上传到R2
            client.putObject(putObjectRequest, RequestBody.fromInputStream(inputStream, file.getSize()));
            //返回上传后的文件访问URL
            return CDN_DOMAIN + "/" + objectKey;
        }catch (Exception e){
            //抛异常
            throw new IOException("文件上传失败"+e.getMessage());
        }
    }



    public MultipartFile convert(String imagePath) throws IOException {
        File file = new File(imagePath);
        try (FileInputStream input = new FileInputStream(file)) {
            return new MockMultipartFile(
                    "image",
                    file.getName(),
                    Files.probeContentType(file.toPath()),
                    input
            );
        }
    }
    private static final DateTimeFormatter AWS_DATE_FORMATTER =
            DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'")
                    .withZone(ZoneOffset.UTC);

    /**
     * 请求拼接
     * @param bucket
     * @param name
     * @return
     */
    public UploadSignVO getPostRoback(String bucket, String name){
        String host = robackAddress;
        UploadSignVO signVO = new UploadSignVO();
        signVO.addParameter("bucket",bucket);
        signVO.addParameter("name",name);
        signVO.setHost(host);
        signVO.setMethod(HttpMethod.POST.name());
        return signVO;
    }

    /**
     * 重新组合文件下载路径
     * @param bucket
     * @param key
     * @return
     */
    public Resource get(String bucket, String key){
        try {
            return new UrlResource(getOssFileUrl(bucket,key));
        }catch (Exception e){
            System.out.println("请求异常"+e);
        }
        return null;
    }
    private URL getOssFileUrl(String bucket, String fileName){
        try {
            return new URL(CDN_DOMAIN+"/"+bucket+"/"+fileName);
        }catch (Exception e){
            System.out.println("请求异常"+e);
        }
       return null;
    }

}

(1)新建桶在这里

在这里插入图片描述

(2)ACCESS_KEY 、SECRET_KEY 添加令牌

ACCESS_KEY 对应 访问密钥 ID
SECRET_KEY 对应 机密访问密钥
在这里插入图片描述

权限根据需求选择

在这里插入图片描述

(3)自定义域名在这里

在这里插入图片描述

(4)CORS 策略 必做 (位置在桶里)

[
  {
    "AllowedOrigins": [
      "*"
    ],
    "AllowedMethods": [
      "GET",
      "PUT",
      "POST"
    ],
    "AllowedHeaders": [
      "*"
    ],
    "ExposeHeaders": [
      "ETag"
    ],
    "MaxAgeSeconds": 300
  }
]

(5)访问地址

在申请令牌时有链接提示
https://《你自己的帐户 ID》.r2.cloudflarestorage.com
示例
https://5bddf25182f42dd05d9.r2.cloudflarestorage.com
或者在 概述–》点击域名–》右侧 账户ID

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐