我试图将文件(图片和视频)上传到AWS CloudFront分布,它指向一个s3桶。
目前,我可以使用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答案中发现,我需要添加client.DefaultRequestHeaders.Add("x-amz-acl", "bucket-owner-full-control");
来给我的对象ACL访问权限,这样桶主就可以通过控制台访问。
我知道我可以使用AWS S3 SDK上传到S3,我可以启用传输加速,尽管AWS FAQ指出,在上传较小的文件或数据集(<1GB)时,CloudFront是一个更好的选择。
我发现CloudFront的文档很模糊,除了CloudFront发行版的初始设置外,其他都是错误的,或者根本不存在。
上述方法是否是通过CloudFront将任何文件上传到S3的正确方法,还是有一个优化的、更强大的方法(例如,多部分上传,所以较大的文件可以恢复)--我想优化这个方法来上传视频,所以如果答案可以集中在这个方面,将不胜感激。
AWS支持部门建议作出回应,以防对某人有所帮助。
... 三个可能的解决方案。第一种是,你可以通过一个签名的URL将对象PUT到 S3,通过一个签名的URL到S3原点。第二种方案,将 文件通过CF放到S3中,通过S3预签名的URL。第三种也是最 最有利的选择,使用传输加速端点把 对象到S3。
根据我的理解,常见问题指出,使用CF而不是TA 端点更适合小于1GB的文件,因为TA是为大文件优化的。 对较大的文件进行了优化。然而,有许多因素可以影响到 我建议测试这两种方法,看看哪种服务最适合你的环境。 对你的环境最有效。
他们还提到CF在做多部分上传时要复杂得多。
如果你需要使用CloudFront 签署的URL的其他原因。你将需要使用Multipart 上传API(InitiateMultipartUpload, UploadPart, CompleteMultipartUpload),并相应地签署它们。不幸的是,我们