我需要一种方法让客户端将数据上传到 S3,而不向他们显示文件的完整位置(路径)。这可以通过 AWS S3 预签名 URL 实现吗?
我正在使用 boto3
s3.client.generate_presigned_url(
ClientMethod='put_object',
ExpiresIn=7200,
Params={'Bucket': BUCKET, 'Key': name}
)
但结果将是:
https://s3.amazonaws.com/MY_BUCKET/upload/xxxx-xxxx/file-name.bin?AWSAccessKeyId=XXXX&Signature=XXXX&Expires=XXXX
我需要类似的东西,不会在路径中显示 key 名称(/upload/xxxx-xxxx/file-name.bin
)。
如果没有预签名网址,我还有哪些其他解决方案?
最佳答案
我认为最好的方法是使用 AWS Cloudfront 分发文件。您可以将 Cloudfront 发行版的来源设置为 MY_BUCKET.s3.amazonaws.com
。还可以使用 MY_BUCKET.s3.amazonaws.com/upload
等子文件夹作为源。
Cloudfront 将使用生成的 CDN 端点域在 S3 源中为您的文件提供服务,或者也可以设置和使用自定义域。
https://d111111abcdef8.cloudfront.net/upload/xxxx-xxxx/file-name.bin https://uploads.example.com/upload/xxxx-xxxx/file-name.bin
如果您使用子文件夹作为源:
https://uploads.example.com/xxxx-xxxx/file-name.bin
有关在 Cloudfront 上将 S3 存储桶设置为源的更多信息:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistS3AndCustomOrigins.html#concept_S3Origin
有关使用 S3 存储桶的目录路径作为源的更多信息:https://aws.amazon.com/about-aws/whats-new/2014/12/16/amazon-cloudfront-now-allows-directory-path-as-origin-name/
有关自定义 URL 的更多信息:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html
关于amazon-web-services - S3 预签名 url 不带路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54932737/