PHP сохраняет удаленное изображение в Amazon S3
Есть ли способ захватить изображение с помощью URL-адреса и сохранить его непосредственно в Amazon?
Используя PHP?
Другим моим вариантом было сохранить файл локально и отправить его с помощью PHP-класса S3.
3 answers
Когда вы "захватите изображение", вам придется, как минимум, записать его во временный файл локально. Это потому, что независимо от того, используете ли вы fopen() или curl для доступа к файлу, вам понадобится какой-то способ записи потока в Amazon. Я не уверен в способе программирования потока, который по существу подключает удаленный файл непосредственно к S3. На самом деле, это теоретически невозможно, так как S3 не может выполнять сценарии, а изображение не может запускать сценарий.
Вы можете загрузить изображение через некоторые форма буфера потока, если вы хотите свести к минимуму объем информации, хранящейся в памяти, но записать ее во временный файл должно быть проще всего. Если у вас не хватает места из-за большого количества пользователей в системе, вы либо переходите на большой сервер, либо добавляете другой сервер под балансировщиком нагрузки. Лично я использую PHP-класс Amazon S3 в своей системе и перемещаю его из временного файла локально непосредственно в S3, используя сценарий, подобный этому:
function upload_image( $image_data )
{
//
// Write the image to S3
//
$s3 = new AmazonS3();
$bucket = ACTIVITY_S3_BUCKET;
$image_id = uniqid('myscript');
$path = ACTIVITY_S3_FOLDER.'/'.$image_id;
$response = $s3->create_object($bucket, $path, array(
'body' => $image_data,
'acl' => AmazonS3::ACL_PUBLIC
));
$image_url = 'https://s3.amazonaws.com/'.ACTIVITY_S3_BUCKET.'/'.$path;
return $image_id;
}
Очевидно, что это не надежный сценарий, но решил, что я просто поделюсь тем путем, по которому прошел сам. Я должен добавить, поскольку, похоже, вашей главной заботой в этом случае будет вычислительная мощность, ознакомьтесь с этим интересным сообщением об изменении размеров миллиардов изображений в облаке. http://www.nslms.com/2010/11/01/how-to-resize-billions-of-images-in-the-cloud/
Обновление Согласно этому ответу Как лучше изменить размер изображений вне сервера "PHP/GD позволяет отправлять jpeg непосредственно в http-ответе".
Вы можете сохранять удаленные файлы непосредственно в S3 с помощью Оболочки потока Amazon S3. Нет необходимости сохранять временную копию на вашем сервере.
// Register the stream wrapper from an S3Client object
$client->registerStreamWrapper();
// Copy a remote file to Amazon S3
copy('http://example.com/1.jpg', 's3://bucket/key');
Он также позволяет хранить и извлекать данные из Amazon S3 с помощью встроенных функций PHP, таких как file_get_contents
, fopen
, copy
, rename
, unlink
, mkdir
, rmdir
, и т.д.
Конечно, вы можете загрузить изображение на свой сервер, а затем перенести его в сервис Amazon S3. Но, я думаю, будет лучше предоставить клиенту возможность загружать изображение непосредственно в S3, используя форму:
<form action="https://s3-bucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
<input type="hidden" name="key" value="uploads/${filename}">
<input type="hidden" name="AWSAccessKeyId" value="YOUR_AWS_ACCESS_KEY">
<input type="hidden" name="acl" value="private">
<input type="hidden" name="success_action_redirect" value="http://localhost/">
<input type="hidden" name="policy" value="YOUR_POLICY_DOCUMENT_BASE64_ENCODED">
<input type="hidden" name="signature" value="YOUR_CALCULATED_SIGNATURE">
<input type="hidden" name="Content-Type" value="image/jpeg">
File to upload to S3:
<input name="file" type="file">
<br>
<input type="submit" value="Upload File to S3">
</form>
Подробную информацию вы можете найти в официальной документации: http://aws.amazon.com/articles/1434