PHP сохранить удаленный образ в Amazon S3 - PullRequest
4 голосов
/ 03 ноября 2011

Есть ли способ получить изображение с помощью URL и сохранить его непосредственно в Amazon?

Использование PHP?

Другой вариант - сохранить файл локально и отправить его с помощью класса S3 PHP.

Ответы [ 3 ]

5 голосов
/ 03 ноября 2011

Когда вы «захватите изображение», вам придется как минимум записать его во временный файл локально.Это потому, что независимо от того, используете ли вы 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".

1 голос
/ 02 сентября 2015

Вы можете сохранять удаленные файлы непосредственно на S3 с помощью Amazon S3 Stream Wrapper .Нет необходимости сохранять временную копию на вашем сервере.

// 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 и т. Д.

0 голосов
/ 03 ноября 2011

Конечно, вы можете загрузить изображение на свой сервер, а затем перенести его в сервис 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

...