我正在使用AWS SDK for .NET,我正在寻找一种让用户直接上传到s3存储的方法。
我遇到过aws提供的两种不同方式:
基于浏览器的上传:https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.html
和预约网址:https://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjectPreSignedURLDotNetSDK.html
似乎预分配url是'更容易',因为aws sdk中已存在一个方法来生成一个url传递给客户端,让他将PUT对象直接发送到存储桶(与浏览器上传相比,它似乎也很轻松,因为它不需要浏览器上传所需的所有密钥。)
但我想知道为什么实际上有两种不同的方法。每个人的PRO和CONS是什么?
答案 0 :(得分:2)
无论您是想使用REST API还是使用AWS软件开发工具包与S3进行交互,它都完全可以说明问题。
在这两种情况下,除非存储桶是公共的,否则您需要证明(验证/签署请求)您的身份。
a)如果您要使用REST API,要证明身份,您需要使用'来签署您的请求。 AWS Signature version 4' (已弃用版本2也存在),其中包括三种方法(您已列出的方法)
b)如果您要使用AWS软件开发工具包,则应让SDK执行签名仪式(流程)。因此,选择直接使用SDK来签署请求
(问题的一部分)与浏览器上传相比,它似乎也很轻松,因为它不需要浏览器上传所需的所有密钥 &lt ;
对于以下代码,s3Client
已经获得了您的信誉,无论是来自AWS-CLI-Profile(如果运行本地/笔记本电脑),IAM角色(如果是EC2,lambda等)
string url = s3Client.GetPreSignedURL(request);
答案 1 :(得分:0)
我发现的主要区别是内存消耗。如果你上传相同的图像(46KB)200次(作为测试/基准),内存消耗差别很大。
任何版本PutObject
AWSSDK.Core
3.3.21.19
的{{1}}需要116MB
(SOH:66MB
/ LOH:50MB
)
任何版本PutObject
AWSSDK.Core
3.3.21.19
的{{1}}需要99MB
(SOH:98MB
/ LOH:0.4MB
)
如果您在UseChunkEncoding
上将false
设置为PutObjectRequest
,则可以进一步降低内存消耗: -
PutObject
设置为UseChunkEncoding
的{p> false
需要52MB
(SOH:52MB
/ LOH:0.4MB
)
但从记忆的角度来看,GetPreSignedURL
仍然更好;
GetPreSignedURL
需要32MB
(SOH:32MB
/ LOH:0.4MB
)
如果您经常拨打PutObject
,那么如果出现问题,切换到GetPreSignedURL
以节省内存可能会有所帮助。缺点是你负责重试机制等。
我们在代码库中的任何地方都使用PutObject
,除了一个代码路径非常热并且每天达到800,000次以上的地方。在这种情况下,将其切换为GetPreSignedURL
。
希望有所帮助!