You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:13:19