Ответ 1
Думаю, это должно быть возможно. Вы просмотрели Использование AWS S3 для хранения статических активов и загрузки файлов?
Я хотел бы включить использование моего ковша Amazon S3 для моего приложения Heroku.
Перед Heroku я использовал s3fs для непосредственного монтирования каталога. Теперь, когда это невозможно на Heroku, есть ли другой способ "связать" их вместе, возможно, все еще сохраняя сценарии загрузки (& resize)?
Думаю, это должно быть возможно. Вы просмотрели Использование AWS S3 для хранения статических активов и загрузки файлов?
В зависимости от того, что делают ваши скрипты, вам, возможно, придется немного их изменить.
Я должен указать, прежде всего, что я никогда этого не делал, поэтому мне не хватало некоторых деталей, но из моего опыта работы с PHP, Heroku и S3 это должно быть так же просто, как принять загруженный файл (который будет сохранен во временном каталоге где-то на сервере Heroku), измените размер и, наконец, загрузите его на S3.
Если у вас уже есть рабочий процесс загрузки, единственное различие заключается в том, что вместо сохранения файла в каталог на вашем сервере (который, как вы говорите, фактически был своего рода символической ссылкой на ведро S3), вы теперь загрузите его на S3. Вы можете сделать это легко с помощью этой библиотеки: https://github.com/tpyo/amazon-s3-php-class
Что-то вроде этого:
// Ink is expensive, let write less
$file = $_FILES['uploadedfile']['tmp_name'];
$name = $_FILES['pictures']['name'];
// Resize the image
resize($file);
// Normally you would do this for storing the file locally
// move_uploaded_file($file, "$destinationdir/$name");
// Now you want to upload to S3
$s3 = new S3($awsAccessKey, $awsSecretKey);
$s3->putObject($s3->inputFile($file, false), $bucketName, $uploadName, S3::ACL_PUBLIC_READ)
В зависимости от того, как вы упорядочиваете свои закачки, вы также можете сохранить запись о названии ведра и имени файла, возможно, в таблице базы данных, где вы можете искать имя файла и получать имя ведра, поскольку вы будете нужно как извлечь файл.
Вам нужно вручную загрузить загруженный файл и загрузить его на S3. Имейте в виду, что Heroku имеет файловую систему только для чтения, поэтому вы не можете создавать временный файл в приложении Heroku, каждая операция должна выполняются в памяти.
Вот S3 php api
// get uploaded file
$file = $_FILES['uploadedfile']['tmp_name'];
// do whatever manipulation on the file in memory
// $file = resize($file)
// upload file to S3, note, S3->putObjectFile won't work, as it require $file parameter to be string
if (S3::putObject(S3::inputFile($file), $bucket, $uri, S3::ACL_PRIVATE)) {
echo "File uploaded.";
} else {
echo "Failed to upload file.";
}
похоже, что у S3 php lib нет api для загрузки ресурса из памяти, S3:: inputFile нужна строка как входная, а не в ресурс памяти. Итак, вывод: это невозможно сделать с S3 PHP-клиентом на Heroku