一句話:核心就一個類別 GetPreSignedUrlRequest——填幾個屬性,交給 s3.GetPreSignedURL(req) 就拿到一條標準 SigV4 URL。切 GET/PUT 靠 Verb,期限用 Expires(絕對時間點)。
NuGet 套件:AWSSDK.S3。
var s3 = new AmazonS3Client("accessKey", "secretKey", RegionEndpoint.APNortheast1);
region 就是 Level 3 X-Amz-Credential 裡的區域欄位——簽章跟它綁在一起算,所以要先指定。
var req = new GetPreSignedUrlRequest {
BucketName = "my-bucket",
Key = "photo.jpg",
Expires = DateTime.UtcNow.AddMinutes(15) // Verb 省略 = GET
};
string url = s3.GetPreSignedURL(req);
var putReq = new GetPreSignedUrlRequest {
BucketName = "my-bucket",
Key = "uploads/photo.jpg",
Verb = HttpVerb.PUT,
Expires = DateTime.UtcNow.AddMinutes(10),
ContentType = "image/jpeg" // 填了就會被簽進 SignedHeaders
};
string uploadUrl = s3.GetPreSignedURL(putReq);
Verb 不填=GET;要上傳設 HttpVerb.PUT。一條 URL 只能一種動作。Expires 是絕對時間點(DateTime),寫 DateTime.UtcNow.Add...,不是「幾秒後」。這是跟 MinIO SDK 最易混的差別。ContentType,上傳時 Content-Type header 就得一字不差,否則 SignatureDoesNotMatch。非同步版本:await s3.GetPreSignedURLAsync(req),行為一致。