我正在尝试将文件(图像和视频)上传到指向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的正确方法,或者是否存在优化的,更强大的方式(例如,多部分上传,因此可以恢复更大的文件) - 我想优化这个以上传视频,所以如果答案可以关注这一点,我们将不胜感激。
答案 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 加速端点(如果可能)。