如何使用 C# HttpClient 或 AWS SDK 通过 CloudFront 将视频上传到 S3
Posted
技术标签:
【中文标题】如何使用 C# HttpClient 或 AWS SDK 通过 CloudFront 将视频上传到 S3【英文标题】:How to upload video to S3 via CloudFront using C# HttpClient or AWS SDK 【发布时间】:2017-04-24 19:04:57 【问题描述】:我正在尝试将文件(图像和视频)上传到指向 s3 存储桶的 AWS CloudFront 分配。
目前,我可以使用 HttpClient 使用通过 CloudFront SDK 生成的签名 URL 来获取和放置文件。
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 开发工具包上传到 S3,并且可以启用传输加速,但 AWS 常见问题解答指出 CloudFront 在上传较小的文件或数据集 (
除了 CloudFront 分配的初始设置之外,我发现 CloudFront 文档含糊、错误或不存在。
上述方法是通过 CloudFront 将 任何 文件上传到 S3 的正确方法,还是有一种优化的、更强大的方法(例如,分段上传,因此可以恢复更大的文件)-我想优化这个以上传视频,所以如果答案可以集中在这个上,将不胜感激。
【问题讨论】:
为什么不直接上传到s3 bucket呢? 这是我们目前正在做的,但是对于来自存储桶的世界另一端的用户来说延迟太高了。使用 CloudFront 允许用户上传到边缘站点,然后通过内部 AWS 网络传输到存储桶(类似于 s3 加速传输 - 虽然我承认,我不确定为什么较大的对象应该通过 TA 而较小的对象应该通过 CF - 他们两者都使用边缘位置)。 有趣,我不知道 CloudFront 支持这个。 @RichardSzalay - 自 2013 年以来是的 (aws.amazon.com/about-aws/whats-new/2013/10/15/…) - 尽管至少可以说文档很少。 @MrShoubs - 您目前使用 S3TA 有什么原因吗? 【参考方案1】:AWS Support 建议响应,以防这对某人有所帮助:
... 三种可能的解决方案。第一个是您可以将对象放入 S3 通过签名 URL 到 S3 源。第二个选项,PUTing 通过 CF 文件通过 S3 预签名 URL 进入 S3。第三个也是最多的 有利的选项,使用 Transfer Acceleration Endpoint 将 对象进入 S3。
据我了解,FAQ 指出使用 CF 而不是 TA 端点更适合小于 1 GB 的文件,因为 TA 已优化 对于较大的文件。但是,有很多因素可以影响 性能,我建议测试这两种方法以查看哪个服务 最适合您的环境。
他们还提到 CF 进行分段上传要复杂得多:
如果您需要使用 CloudFront,这将变得更加困难 出于其他原因签名的 URL。您将需要使用 Multipart 上传 API(InitiateMultipartUpload、UploadPart、 CompleteMultipartUpload)并相应地签名。不幸的是我们 没有关于如何执行此操作的任何文档或步骤。你可以找到 有关分段上传过程的更多信息,请点击此处 [2]。
我强烈推荐使用 TransferUtility 和 S3 Transfer 如果可能,加速端点。
【讨论】:
我知道它已经过时了,但我确实需要通过 Cloudfront 进行分段上传的任何示例代码。在任何情况下,你都这样做了吗? @Tủn 不确定这是否对您有帮助:docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html。您也可以使用 s3 加速传输。我不确定我们是否通过云端管理它。以上是关于如何使用 C# HttpClient 或 AWS SDK 通过 CloudFront 将视频上传到 S3的主要内容,如果未能解决你的问题,请参考以下文章
c#:如何使用 httpclient 发布异步请求并获取流?
如何在 C# 中使用 HttpClient 存储 cookie?
如何在 C# 中使用 HttpClient 读取 Web api 响应
使用 HttpClient.GetAsync() 时如何确定 404 响应状态