【发布时间】:2015-10-19 12:54:14
【问题描述】:
在我使用 laravel 5.1 构建的 Web 应用程序中,用户可以上传一些我存储在 Amazon S3 中的敏感文件。稍后我希望用户有许可 下载此文件。由于我希望进行此身份验证检查,因此我无法使用传统方法通过直接链接到 S3 中的文件来下载文件。
我的做法:
当用户请求下载时,我的服务器会在本地下载文件,然后流式传输给用户。 问题:需要很长时间,因为有时文件太大。
为用户提供一个预签名 URL,以便直接从 S3 下载。 URL 仅在 5 分钟内有效。 问题:如果该 URL 是共享的,任何人都可以在 5 分钟内下载它。
According to this article,将数据直接从 S3 流式传输到客户端。这看起来很有希望,但我不知道如何实现。
根据这篇文章,我需要:
-
注册流包装器 - 这是我的第一个问题,因为我不知道如何获取
S3Client对象,因为 laravel 使用 flysystem,而且我不知道要调用什么方法来获取它目的。也许我需要在我的 composer.json 中单独包含 S3 包? - 禁用输出缓冲 - 我需要在 laravel 中执行此操作还是 laravel 已经处理了它?
我相信其他开发人员之前已经看到过这样的问题,并希望获得一些帮助。如果有人已经使用 laravel Response::download($pathToFile, $name, $headers) 直接从 S3 流式传输到客户端,那么我很想听听你的方法。
【问题讨论】:
-
不是来自 S3->user 的流,是流 S3->Laravel->user。您的服务器仍在循环中,因此您会产生带宽并错过直接从 S3 提供服务的大部分好处。
-
@ceejayoz 我明白,但我有什么选择。我无法直接访问 S3 中的文件。另外,我必须让文件公开可见,以便其他人下载。
-
您可能可以用temporary IAM credentials 拼凑一些东西,将签名 URL 的使用限制为特定 IP。
-
@ceejayoz 感谢您的链接。但是,如果我的用户被授予 IAM 角色,他们必须是 AWS/Amazon 的一部分还是必须登录?
-
只要请求开始,就会被允许完成。顺便说一句,如果您将 CloudFront 放在 S3 之前,您的签名 URL 可以限制为 IP 地址。请参阅docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/… -
"IpAddress":{"AWS:SourceIp":"optional IP address"}- 这将为您的方案增加一些额外的安全性。
标签: laravel amazon-s3 laravel-5 flysystem