在开始之前,您必须生成 Access Key。所有示例都将使用 access_key_id 和 access_key_secret 变量,分别代表您生成的 Access Key ID(访问密钥 ID) 和 Secret Access Key(秘密访问密钥) 值。
本示例使用 aws-sdk-kotlin ↗。实例化 S3 客户端时,必须传入 R2 配置凭据:
import aws.sdk.kotlin.runtime.auth.credentials.StaticCredentialsProvider
import aws.sdk.kotlin.services.s3.S3Client
import aws.sdk.kotlin.services.s3.listObjects
import aws.sdk.kotlin.services.s3.model.GetObjectRequest
import aws.sdk.kotlin.services.s3.model.PutObjectRequest
import aws.sdk.kotlin.services.s3.presigners.presignGetObject
import aws.sdk.kotlin.services.s3.presigners.presignPutObject
import aws.smithy.kotlin.runtime.auth.awscredentials.Credentials
import aws.smithy.kotlin.runtime.net.url.Url
import kotlinx.coroutines.runBlocking
import kotlin.time.Duration.Companion.minutes
val ACCOUNT_ID = "<ACCOUNT_ID>"
val ACCESS_KEY = "<ACCESS_KEY>"
val SECRET_KEY = "<SECRET_KEY>"
fun main() = runBlocking {
val r2Client = S3Client.fromEnvironment {
region = "auto" // Required by SDK, but not used by R2
endpointUrl = Url.parse("https://${ACCOUNT_ID}.r2.cloudflarestorage.com")
credentialsProvider = StaticCredentialsProvider(
Credentials(
accessKeyId = ACCESS_KEY,
secretAccessKey = SECRET_KEY
),
)
}
println("Available buckets:")
r2Client.listBuckets().buckets?.forEach { bucket ->
println("* ${bucket.name}")
}
val bucketName = "<BUCKET_NAME>"
println("\nObjects in bucket '${bucketName}':")
r2Client.listObjects { bucket = bucketName }.contents?.forEach {
println("* ${it.key} (size: ${it.size} bytes, modified: ${it.lastModified})")
}
r2Client.close()
}Available buckets:
* my-bucket-1
* my-bucket-2
Objects in bucket 'my-bucket-1':
* image1.png (size: 253167 bytes, modified: 2026-01-17T11:30:58.896Z)
* image2.png (size: 247027 bytes, modified: 2026-01-17T11:30:57.779Z)您还可以生成预签名链接,用于临时共享存储桶的公开读取或写入访问权限。
val uploadUrl = r2Client.presignPutObject(
input = PutObjectRequest {
bucket = bucketName
key = "README.md"
},
duration = 15.minutes,
).url
println(uploadUrl)
val getUrl = r2Client.presignGetObject(
input = GetObjectRequest {
bucket = bucketName
key = "README.md"
},
duration = 15.minutes,
).url
println(getUrl)您可以使用任何 HTTP 客户端配合这些预签名 URL。例如,使用 PUT URL 上传文件:
curl -X PUT "https://<your-presigned-put-url>" -H "Content-Type: application/octet-stream" --data-binary "@local-file.txt"使用 GET URL 下载文件:
curl -X GET "https://<your-presigned-get-url>" -o downloaded-file.txt