Я использую 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;
Это будет едва «касаться сторон» и не должно слишком затягивать внешний вид ваших файлов, но t все еще будет использовать некоторые ресурсы и пропускную способность.
Вам нужно будет получить доступ к файлам через скрипт на вашем сервере. Этот скрипт выполнит некоторую проверку подлинности, чтобы убедиться, что запрос действителен, и вы хотите, чтобы они видели файл. Затем извлеките файл из 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 «веб-сервером» таким, как это, но тогда вы, вероятно, «сделаете файлы общедоступными». Тогда, если у вас есть какая-то логика для ограничения доступа, вы можете создать политику ведра