phpqrcode + сохранить кешированный файл в Amazon вместо папки на сервере

Сейчас я создаю изображение QR-кода (PNG) и сохраняю его копию в папке в корне моего сервера. Теперь я хотел бы сохранить это изображение не на своем сервере, а в своем ведре Amazon.

Я знаю, как я могу сохранить файл на Amazon, но я не могу понять, как заставить это работать вместе. Это мой исходный код для его сохранения в корневой папке на моем сервере:

$fileName = $quiz_url . '.png';

$pngAbsoluteFilePath = APPLICATION_PATH . '/../public/qrcodecaches/' . $fileName; 
$urlRelativeFilePath = '/qrcodecaches/' . $fileName;

// generating
if (!file_exists($pngAbsoluteFilePath)) {
    QRcode::png('http://mysitelink.com/s/'.$quiz_url, $pngAbsoluteFilePath, 'L', 4, 2);
}

И вот как я сохраняю файл на Amazon:

$bucket = 'mybucket';
$map = 'qrcodecaches';

$client = S3Client::factory(array(
    'key'    => 'mykey',
    'secret' => 'mysecret',
));


$fileName = $quiz_url . '.png';
$keyname = $map . '/' . $fileName;

try {
    $client->putObject(array(
        'Bucket' => $bucket,
        'Key'    => $keyname,
        'Body'   => fopen('/path/to/file', 'r'),
        'ACL'    => 'public-read',
    ));
   } catch (S3Exception $e) {
        echo "There was an error uploading the file.\n";
}

Но что мне нужно сохранить в теге «Тело»? Может ли кто-нибудь помочь мне с этим?


person nielsv    schedule 04.12.2013    source источник
comment
Лучший учебник, который я нашел на YouTube, по использованию Amazon S3 для загрузки изображений и файлов. Здесь вы узнаете, как использовать его в своем скрипте, и сможете загрузить его в Amazon CDN. Это ссылка на видео youtube.   -  person    schedule 12.12.2013


Ответы (2)


Вы можете создать файл изображения, передав имя временного файла следующим образом:

$pngAbsoluteFilePath = tempnam(sys_get_temp_dir(), 'qr_code_');
if (!file_exists($pngAbsoluteFilePath)) {
    QRcode::png('http://mysitelink.com/s/'.$quiz_url, $pngAbsoluteFilePath, 'L', 4, 2);
}

тогда все, что вам нужно сделать, это получить содержимое этого файла и передать его Body объекта в ведре:

try {
    $client->putObject(array(
        'Bucket' => $bucket,
        'Key'    => $keyname,
        'Body'   => file_get_contents($pngAbsoluteFilePath), // like this
        'ACL'    => 'public-read'
    ));
   }
catch (S3Exception $e) {
   echo "There was an error uploading the file.\n";
}

После того, как вы закончите - в случае успешной загрузки - вы можете удалить временный файл. Это не обязательно, однако рекомендуется, потому что это заполнит ваш /tmp QR-изображениями, пока ваш сервер не будет перезапущен:

if ( empty($e) ) {
    unlink($pngAbsoluteFilePath);
}

Это хорошо сработало для меня.

person Maciej Sz    schedule 06.12.2013
comment
Ваше изображение генерируется правильно? Вы видите это после запуска скрипта по пути $pngAbsoluteFilePath? (убедитесь, что вы не удалили файл для тестов) - person Maciej Sz; 07.12.2013

В документации Amazon S3Client предлагается провести опрос, чтобы убедиться, что загрузка прошла успешно.

$client->waitUntilObjectExists(array(
    'Bucket' => $bucket,
    'Key'    => $keyname
));

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

try {
    $client->putObject(array(
        'Bucket'     => $bucket,
        'Key'        => $keyname,
        'SourceFile' => '/path/to/file',
        'ACL'        => 'public-read'
    ));
   } catch (S3Exception $e) {
        echo "There was an error uploading the file.\n";
}

Источник: http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.S3.S3Client.html#_putObject

person AeroX    schedule 06.12.2013