如何使用LitS3库指定缓存控制头? (亚马逊文件上传)

时间:2011-06-22 00:09:55

标签: asp.net-mvc file-upload amazon-s3 cache-control

我正在使用LitS3 library帮助将我的ASP.NET MVC应用程序中的照片上传到Amazon S3。

我已经阅读了所有文档,用Google搜索,我无法弄清楚如何在上传时为照片设置cache-control标题。

我知道你可以用REST API做到这一点,但是因为我正在使用LitS3库,所以这不是一个选项(除非我完全废弃了库)。

有没有人想出怎么做?

我看到文档中有一节“想要更多的灵活性” - 这似乎可以访问近100%的API,但看不出我如何将其应用到我的情况。

以下是我目前的上传方式:

var s3 = new S3Service { AccessKeyID = _accessKey, SecretAccessKey = _secret };
s3.AddObject(inputStream, 
             _bucketName, 
             fileName, 
             contentType, 
             CannedAcl.PublicRead);

inputStreamStream,我从MVC行动中的HttpPostedFileBase.InputStream获得。

AddObject重载都不支持设置除content-type之外的任何其他标头。所以看起来我需要深入挖掘并使用更低级别的方法,但正如我所说 - 只是无法找到方法。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

知道了!感谢this thread,它与缓存控制无关,但它显示了如何将AddObjectRequest与给定的Stream一起使用。

如果有其他人感兴趣,这是工作代码:

// Create S3 service.
var s3 = new S3Service { AccessKeyID = _accessKey, SecretAccessKey = _secret };

// Create HTTP Request.
var request = new AddObjectRequest(s3, _bucketName, fileName)
{
    CacheControl = "max-age=864000",
    CannedAcl = CannedAcl.PublicRead,
    ContentType = contentType,
    ContentLength = inputStream.Length
};

// Upload photo.
using (var outStream = request.GetRequestStream())
{
    var buffer = new byte[inputStream.Length > 65536 ? 65536 : inputStream.Length];
    var position = 0;
    while (position < inputStream.Length)
    {
        var read = inputStream.Read(buffer, 0, buffer.Length);
        outStream.Write(buffer, 0, read);
        position += read;
    }
    outStream.Flush();
}

var response = request.GetResponse();
response.Close();