基于Vapor的Swift后端:如何用AWS SDK for Swift生成S3预签名URL?
使用AWS SDK for Swift生成S3预签名URL(Vapor场景)
功能可用性说明
AWS SDK for Swift完全支持生成S3对象的预签名URL,不存在功能缺失的情况。
实现步骤
1. 配置AWS SDK客户端
在Vapor项目中先完成S3客户端的全局配置,方便后续调用:
import AWSS3 import Vapor extension Application { var s3: S3Client { guard let client = self.storage[S3ClientKey.self] else { let client = S3Client(region: .usEast1) // 替换为你的S3存储桶所在区域 self.storage[S3ClientKey.self] = client return client } return client } } private struct S3ClientKey: StorageKey { typealias Value = S3Client }
2. 生成预签名下载URL
创建Vapor路由处理函数,生成指定PDF文件的预签名URL:
import Vapor import AWSS3 func routes(_ app: Application) throws { app.get("presigned-download-url") { req async throws -> String in let bucketName = "your-target-bucket" // 替换为你的存储桶名称 let objectKey = "pdf-docs/user-manual.pdf" // 替换为目标PDF的对象键 // 构造获取对象的请求 let getRequest = GetObjectRequest( bucket: bucketName, key: objectKey ) // 生成有效期1小时的预签名URL let presignedURL = try await req.application.s3.presignedURL( for: getRequest, expires: .seconds(3600) ) return presignedURL.absoluteString } }
3. 关键注意事项
- 权限验证:生成URL的AWS凭证必须拥有
s3:GetObject权限,否则生成的URL无法访问目标对象。 - 过期时间限制:S3服务限制预签名URL的最长有效期为7天,可根据业务需求调整
expires参数。 - HTTPS默认支持:生成的预签名URL默认使用HTTPS,确保你的存储桶已配置HTTPS访问。
扩展说明
如果需要生成用于上传的预签名URL,只需将GetObjectRequest替换为PutObjectRequest,调用presignedURL方法的逻辑完全一致。
内容的提问来源于stack exchange,提问作者KVISH
相关产品推荐
相关产品推荐

