白嫖对象存储10T空间。下载免费---S3对接
Cloudflare R2 Storage允许开发人员存储大量非结构化数据,而无需支付与典型云存储服务相关的昂贵出口带宽费用。高性能的文件和对象存储,无输出费用。官网:https://dash.cloudflare.com/一张visa卡需要绑定卡,实名信息等。您可以将R2用于多种场景,包括但不限于:云原生应用程序的存储web内容的云存储播客集的存储数据湖(分析和大数据)用于大批量处理的云存储输出
白嫖对象存储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
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐

所有评论(0)