Подтвердить что ты не робот

Amazon S3 на Heroku с PHP

Я хотел бы включить использование моего ковша Amazon S3 для моего приложения Heroku.

Перед Heroku я использовал s3fs для непосредственного монтирования каталога. Теперь, когда это невозможно на Heroku, есть ли другой способ "связать" их вместе, возможно, все еще сохраняя сценарии загрузки (& resize)?

4b9b3361

Ответ 2

В зависимости от того, что делают ваши скрипты, вам, возможно, придется немного их изменить.

Я должен указать, прежде всего, что я никогда этого не делал, поэтому мне не хватало некоторых деталей, но из моего опыта работы с 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)

В зависимости от того, как вы упорядочиваете свои закачки, вы также можете сохранить запись о названии ведра и имени файла, возможно, в таблице базы данных, где вы можете искать имя файла и получать имя ведра, поскольку вы будете нужно как извлечь файл.

Ответ 3

Вам нужно вручную загрузить загруженный файл и загрузить его на 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.";
}

Update

похоже, что у S3 php lib нет api для загрузки ресурса из памяти, S3:: inputFile нужна строка как входная, а не в ресурс памяти. Итак, вывод: это невозможно сделать с S3 PHP-клиентом на Heroku