phpqrcode +将缓存文件保存到Amazon而不是服务器上的文件夹

时间:2013-12-04 15:01:31

标签: php amazon-web-services amazon-s3 save qr-code

我现在所做的是创建QR码图像(PNG)并将其副本保存在我服务器根目录下的文件夹中。现在我想保存这个图像不是在我的服务器上,而是在我的亚马逊桶上。

我知道如何在亚马逊上保存文件,但我无法弄清楚如何将这项工作放在一起。 这是我将其保存在服务器上的根文件夹中的原始代码:

$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);
}

这就是我在亚马逊上保存文件的方式:

$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";
}

但是我需要在'Body'标签中保存什么?有人可以帮我吗?

2 个答案:

答案 0 :(得分: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);
}

这对我有用。

答案 1 :(得分:1)

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