2015-10-27 5 views
1

Я использую PHP CURL для создания настроенного изображения PNG из REST API. Как только это изображение загрузилось, я хотел бы загрузить его в ведро AWS S3 и показать ссылку на него.Получить изображение через PHP curl, а затем загрузить в S3

Вот мой сценарий до сих пор:

$ch = curl_init(); 
$timeout = 5; 
curl_setopt($ch, CURLOPT_URL, 'http://url-to-generate-image.com?options=' + $_GET['options']); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$data = curl_exec($ch); 
$info=curl_getinfo($ch); 
curl_close($ch); 

//require S3 Class 
if (!class_exists('S3')) { 
    require_once('S3.php'); 
} 

//AWS access info 
if (!defined('awsAccessKey')) { 
    define('awsAccessKey', 'MY_ACCESS_KEY'); 
} 
if (!defined('awsSecretKey')) { 
    define('awsSecretKey', 'MY_SECRET_KEY'); 
} 

//instantiate the class 
$s3 = new S3(awsAccessKey, awsSecretKey); 
$s3->putBucket('bucket-name', S3::ACL_PUBLIC_READ); 

$file_name = md5(rand(99,99999999)) + '-myImage.png'; 

if ($s3->putObjectFile($data, 'bucket-name' , $file_name, S3::ACL_PUBLIC_READ)) { 

    echo 'success'; 

    $gif_url = 'http://bucket-name.s3.amazonaws.com/'.$file_name; 

} else { 

    echo 'failed'; 

} 

Он держит неудачу. Теперь, я думаю, проблема в том, где я использую putObjectFile - переменная $data представляет изображение, но, возможно, ее нужно передать другим способом?

Я использую общий PHP класс для S3: http://undesigned.org.za/2007/10/22/amazon-s3-php-class

+1

Беглый взгляд на класс заставляет меня думать, что библиотека ожидает первый из параметров будет путь к файлу, а не файл данных. Если он не является файлом или недоступен, он запускает 'trigger_error ('S3 :: inputFile(): не удается открыть входной файл:'. $ File, E_USER_WARNING);' и возвращает false. –

+0

@JonStirling - Спасибо, ты прав. Я искал поисковые запросы и даже не могу понять, есть ли способ загрузить данные файла на S3 .. – Frank

+0

@Mortimer проверить мой ответ. – jpaljasma

ответ

1

Использование PHP обертку памяти для хранения содержимого изображения, и использовать $s3->putObject() метод:

$fp = fopen('php://memory', 'wb'); 
fwrite($fp, $data); 
rewind($fp); 
$s3->putObject([ 
    'Bucket' => $bucketName, 
    'Key' => $fileName, 
    'ContentType' => 'image/png', 
    'Body' => $fp, 
]); 
fclose($fp); 

испытанный метод (вы может нужно немного изменить код) с помощью PHP 5.5 и последних AWS-библиотек.

http://php.net/manual/en/wrappers.php.php

Смежные вопросы