如何以编程方式为Amazon S3设置Http头?

14

我希望为由我的asp.net web应用程序存储在S3中的文件设置到期日期头。

  • 第一种情况 - 在PutObject请求期间
  • 第二种情况 - 每月更新一次到期日期以更新到期日期。
3个回答

19

因为您在使用Asp.net,我假设您正在使用AWS .NET SDK

要在上传对象时添加Expires(或任何其他HTTP标头),请将其作为PutObject请求的一部分添加。

var client = new Amazon.S3.AmazonS3Client(AWS_Key, AWS_SecretKey);

var req = new Amazon.S3.Model.PutObjectRequest()
                 .WithFilePath(@"C:\myfile.txt")
                 .WithKey("myfile.txt")
                 .WithBucketName("mybucket");

req.AddHeader("expires", "Thu, 01 Dec 1994 16:00:00 GMT");

client.PutObject(req);

若要更改现有对象的标题,您需要将该对象复制到其自身。

var req = new Amazon.S3.Model.CopyObjectRequest()
                 .WithDirective(Amazon.S3.Model.S3MetadataDirective.REPLACE)
                 .WithSourceBucket("mybucket")
                 .WithSourceKey("myfile.txt")
                 .WithDestinationBucket("mybucket")
                 .WithDestinationKey("myfile.txt");

req.AddHeader("expires", "Thu, 01 Dec 1994 16:00:00 GMT");

client.CopyObject(req);

注意:必须设置.WithDirective(Amazon.S3.Model.S3MetadataDirective.REPLACE)以指定新的标头。否则,现有的标头只会被复制。

了解更多信息,请参阅.NET SDK文档


谢谢你的回答。在我们实施后,我会在一两天内将其标记为已接受。 - st78
这个答案比SDK文档更有用:http://docs.amazonwebservices.com/sdkfornet/latest/apidocs/html/M_Amazon_S3_Model_S3Request_AddHeader.htm "将标头添加到请求的标头集合中。" - Chris Moschini

9
如果您使用的是AWS SDK 2.X,则"AddHeader"方法不再可用。要添加标题,只需直接修改header集合即可。 req.Headers["expires"] = "Thu, 01 Dec 1994 16:00:00 GMT"; 以下是Geoff上面使用的修改后的示例:
var client = new Amazon.S3.AmazonS3Client(AWS_Key, AWS_SecretKey);

var req = PutObjectRequest req= new PutObjectRequest()
{
    BucketName = "mybucket",
    Key = "myfile.txt",
    FilePath = @"C:\myfile.txt"
};

req.Headers["expires"] = "Thu, 01 Dec 1994 16:00:00 GMT";

client.PutObject(req);

更改标题的方法也是相同的:
var req = new Amazon.S3.Model.CopyObjectRequest()
{
    MetadataDirective = S3MetadataDirective.REPLACE,
    SourceBucket = "mybucket",
    SourceKey = "myfile.txt",
    DestinationBucket = "mybucket",
    DestinationKey = "myfile.txt"
};

req.Headers["expires"] = "Thu, 01 Dec 1994 16:00:00 GMT";

client.CopyObject(req);

当您更改标头时要小心,因为上面的代码也会更改权限,如果它是完全私有的,则例如公共读取。为保持相同的“CannedACL”,请在请求中指定它。 - aBertrand

3

针对 AWSSDK.S3 V3.* 的情况,它的工作原理如下:

request.Headers.Expires = DateTime.Now.AddMinutes(2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接