Cloudflare R2 定价情况
cloudflare R2对象存储每个月提供10GB的免费额度,对于个人开发者足够使用,接下来开始配置
配置
-
配置支付方式
此处正常填写信息即可,如果没有信用卡,可以使用paypal(绑定普通银行卡)
-
创建存储桶
-
使用自定义域访问
填写自定义域,点击连接域后,Cloudflare会自动为我们已经托管在其上的域名添加DNS记录
Java工具类
-
引入Maven依赖
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.27.13</version> </dependency>
-
工具类实现如下
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; } }
-
创建API令牌
-
获取
access-key-id
、secret-access-key
、end-point
、bucket-name
前三个在创建好API令牌后可以轻松获取,bucket-name是前面创建的令牌桶的名字
-
在
application.yml
中添加配置R2: access-key-id: secret-access-key: end-point: https: bucket-name:
-
编写接口测试工具类
接口如下:
@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()); } } }
-
使用Apifox测试接口
返回链接经检验是所上传图片,成功!后续需要添加图片、视频、音频格式判断及压缩等代码。