PHP Amazon S3 通过URL 访问私有文件

PHP Amazon S3 access private files through URL

我正在使用 AWS PHP sdk 在 S3 上保存图像。文件是私下保存的。然后,我在我的 Web 应用程序中使用 S3 文件 url 显示图像缩略图,但由于文件是私有的,因此图像显示为已损坏。

当用户单击文件名时,会打开一个模式以显示更大尺寸的文件,但由于同样的问题,文件在那里也显示为已损坏。

现在,我知道有两种方法可以让它发挥作用。 1。制作文件 public。 2. 为文件生成预签名的 urls。 但是由于我的项目要求,我无法使用这两个选项中的任何一个。

我的问题是有没有第三种方法可以解决这个问题?

据我所知,您可以尝试让您的 S3 存储桶成为 "web server" like this but then you would probably "Make the files public".Then if you have some kind of logic to restrict the access you could create a bucket policy

您需要通过服务器上的脚本访问这些文件。该脚本将进行某种身份验证以确保请求有效并且您希望他们看到该文件。然后使用可以访问私有文件的有效 IAM 配置文件从 S3 获取文件。输出文件

不是从 S3 请求文件,而是从 http://www.yourdomain.com/fetchimages.php?key=8498439834

然后这里是fetchimages.php

中的一些伪代码
<?php

//if authorized to get this image

$key=$_GET['key'];
//validate key is the proper format

//get s3 url from a database based on the $key

//connect to s3 securely and read the file from s3

//output the file

?>

我强烈反对这样做,但您可以在自己的服务器上创建一个脚本,通过 API 拉取图像,缓存它并提供服务。然后,您可以根据自己的喜好限制访问权限,而无需制作图像 public.

示例通过脚本:

$headers = get_headers($realpath); // Real path being where ever the file really is

foreach($headers as $header) {
    header($header);
}
$filename = $version->getFilename();

// These lines if it's a download you want to do
// header('Content-Description: File Transfer');
// header("Content-Disposition: attachment; filename={$filename}");

$file = fopen($realpath, 'r');
fpassthru($file);
fclose($file);
exit;

这几乎不会 "touch the sides" 并且不会过多地延迟文件的显示,但它仍然会占用一些资源和带宽。