я использую AWS PHP SDK для сохранения изображений на S3. Файлы сохраняются в частном порядке. Затем я показываю миниатюры изображений, используя URL-адрес файла S3 в моем веб-приложении, но поскольку файлы являются закрытыми, изображения отображаются как поврежденные.
Когда пользователь нажимает на имя файла, открывается модальное окно, чтобы показать файл в большем размере, но файл также отображается как поврежденный из-за той же проблемы.
Теперь я знаю, что есть два способа заставить это работать. 1. Сделайте файлы общедоступными. 2. Создайте предварительно подписанные URL-адреса для файлов. Но я не могу пойти ни с одним из этих двух вариантов из-за требований моего проекта.
У меня вопрос, есть ли какой-нибудь третий способ решить эту проблему?
Я настоятельно рекомендую против этого, но вы можете создать скрипт на своем собственном сервере, который извлекает изображение через API, кэширует его и обслуживает. Затем вы можете ограничить доступ, как вам угодно, не публикуя изображения.
Пример прохождения скрипта:
$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;
Это едва ли «коснется сторон» и не должно слишком сильно задерживать появление ваших файлов, но все равно потребует некоторых ресурсов и пропускной способности.
Вам нужно будет получить доступ к файлам через скрипт на вашем сервере. Этот скрипт выполнит некоторую аутентификацию, чтобы убедиться, что запрос действителен, и вы хотите, чтобы они увидели файл. Затем загрузите файл с S3, используя действительный профиль IAM, который может получить доступ к закрытым файлам. Вывести файл
Вместо того, чтобы запрашивать файл у 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
?>
насколько я знаю, вы можете попытаться сделать ваш S3 Bucket «веб-сервером» как это но тогда вы, вероятно, «сделаете файлы общедоступными». Затем, если у вас есть какая-то логика для ограничения доступа, вы можете создать политика ведра