如何用AWS Kotlin SDK通过S3 URL下载大JSON文件
用AWS Kotlin SDK下载S3文件并解析S3 URL
一、解析S3 URL获取Bucket和Key
AWS Kotlin SDK提供了S3Uri工具类,可轻松解析所有格式的S3 URL(路径式、虚拟主机式),无需手动处理复杂的URL结构。
代码示例:
import software.amazon.awssdk.services.s3.model.S3Uri val s3Url = "https://s3.amazonaws.com/account-update/input.csv" // 解析URL val s3Uri = S3Uri.fromUriString(s3Url) // 获取Bucket名称 val bucketName = s3Uri.bucket() // 获取对象Key val keyName = s3Uri.key()
如果URL包含区域信息(如https://my-bucket.s3.us-west-2.amazonaws.com/reports/Q3.csv),还可以直接提取区域:
val regionId = s3Uri.region()?.id() // 结果为"us-west-2"
手动解析(备用方案)
如果不想依赖SDK工具类,也可以手动解析URL,但需要适配不同的S3 URL格式:
路径式URL(bucket在路径中):
val s3Url = "https://s3.amazonaws.com/account-update/input.csv" val uri = java.net.URI(s3Url) val pathSegments = uri.path.split("/").filter { it.isNotEmpty() } val bucketName = pathSegments.first() val keyName = pathSegments.drop(1).joinToString("/")
虚拟主机式URL(bucket在域名中):
val s3Url = "https://my-bucket.s3.us-west-2.amazonaws.com/reports/Q3.csv" val uri = java.net.URI(s3Url) val hostParts = uri.host.split(".") // 提取bucket名称 val bucketName = hostParts.first() // 提取对象Key val keyName = uri.path.removePrefix("/") // 提取区域 val regionId = hostParts[2] // 结果为"us-west-2"
二、完整的文件下载代码
结合URL解析和文件下载的完整示例,使用AWS Kotlin SDK的S3Client:
import software.amazon.awssdk.services.s3.S3Client import software.amazon.awssdk.services.s3.model.GetObjectRequest import software.amazon.awssdk.services.s3.model.S3Uri import java.io.File import java.lang.IllegalArgumentException fun downloadS3File(s3Url: String, localSavePath: String) { // 解析S3 URL val s3Uri = S3Uri.fromUriString(s3Url) val bucketName = s3Uri.bucket() ?: throw IllegalArgumentException("无效的S3 URL:未找到Bucket") val keyName = s3Uri.key() ?: throw IllegalArgumentException("无效的S3 URL:未找到对象Key") val regionId = s3Uri.region()?.id() ?: "us-east-1" // 无区域信息时默认使用us-east-1 // 初始化S3客户端并下载文件 S3Client { region = regionId }.use { s3Client -> val getObjectRequest = GetObjectRequest { bucket = bucketName key = keyName } s3Client.getObject(getObjectRequest) { response -> val localFile = File(localSavePath) // 确保父目录存在 localFile.parentFile?.mkdirs() // 将S3对象写入本地文件 response.body?.writeToFile(localFile) println("文件已成功下载至:${localFile.absolutePath}") } } } // 调用示例 fun main() { val targetS3Url = "https://s3.amazonaws.com/account-update/input.csv" val localFilePath = "./downloads/input.csv" downloadS3File(targetS3Url, localFilePath) }
注意事项
- 确保项目已引入AWS Kotlin SDK的S3依赖,例如Gradle依赖:
implementation("software.amazon.awssdk:s3:2.20.0") - 客户端的区域设置要与S3存储桶所在区域一致,避免跨区域访问的性能损耗;使用
S3Uri提取的区域可以自动适配。 - 处理权限问题:运行代码的环境需要有S3对象的读取权限(例如通过IAM角色、环境变量配置的凭证)。
内容的提问来源于stack exchange,提问作者petalumaboy
相关产品推荐
相关产品推荐

