如何使用C#HttpClient或AWS SDK通过CloudFront将视频上传到S3

时间:2016-12-09 10:19:07

标签: c# .net amazon-web-services amazon-s3 amazon-cloudfront

我正在尝试将文件(图像和视频)上传到指向s3存储桶的AWS CloudFront分配。

目前,我可以使用HttpClient通过CloudFront SDK生成的签名URL来使用GET和PUT文件。

using (HttpClient client = new HttpClient())
using (var stream = File.OpenRead(filepath))
using (HttpResponseMessage response = await client.PutAsync(url, new StreamContent(stream)))
{
    response.EnsureSuccessStatusCode();
}

我最初尝试过POST,但这根本不起作用(它在30秒后超时)我从SO Answer发现我需要添加client.DefaultRequestHeaders.Add("x-amz-acl", "bucket-owner-full-control");来提供我的对象ACL访问权限,以便存储桶拥有者可以通过控制台访问。

我知道我可以使用AWS S3 SDK上传到S3并且我可以启用传输加速,但AWS FAQ指出在上传较小的文件或数据集(<1GB)时CloudFront是更好的选择。

我发现除了CloudFront分配的初始设置之外,CloudFront文档模糊,错误或不存在。

上述方法是否是通过CloudFront将任何文件上传到S3的正确方法,或者是否存在优化的,更强大的方式(例如,多部分上传,因此可以恢复更大的文件) - 我想优化这个以上传视频,所以如果答案可以关注这一点,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

AWS支持建议响应,以防有人:

  

......三种可能的解决方案。第一个是你可以PUT对象   S3通过签名URL到S3原点。第二个选择,PUTing the   通过S3预先签名的URL将CF文件传输到S3。第三和最多   有利的选择,使用传输加速端点来输出   对象进入S3。

     

据我了解,常见问题解答说使用CF而不是TA   端点对于小于1 GB的文件更好,因为TA已经过优化   对于较大的文件。但是,有许多因素可以影响   性能方面,我建议测试两种方法,看看哪种服务   最适合您的环境。

他们还提到CF进行分段上传要复杂得多:

  

如果您需要使用CloudFront,那将会更加困难   由于其他原因而签名的URL。您需要使用Multipart   上传API(InitiateMultipartUpload,UploadPart,   CompleteMultipartUpload)并相应地签名。不幸的是我们   没有任何文档或步骤如何执行此操作。你可以找到   有关分段上传过程的更多信息,请参见[2]。

     

我强烈建议使用TransferUtility和S3 Transfer   加速端点(如果可能)。