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