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

Posted

技术标签:

【中文标题】phpqrcode + 将缓存文件保存到亚马逊而不是服务器上的文件夹【英文标题】:phpqrcode + save cached file to Amazon instead of folder on server 【发布时间】:2013-12-04 15:01:30 【问题描述】:

我现在要做的是创建一个二维码图像 (PNG) 并将其副本保存在我服务器根目录的文件夹中。现在我想把这张图片保存在我的服务器上而不是我的亚马逊存储桶上。

我知道如何在 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);

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

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

但是我需要在“身体”标签中保存什么?有人可以帮我解决这个问题吗?

【问题讨论】:

我在 youtube 上获得的使用 Amazon S3 上传图像和文件的最佳教程。在这里,您将了解如何在脚本中使用它并将其上传到 Amazon CDN。这是youtube视频的链接。 【参考方案1】:

您可以像这样传递一个临时文件名来创建图像文件:

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

完成后 - 如果上传成功 - 您可以删除临时文件。这不是必需的,但建议您这样做,因为它会在您的服务器重新启动之前用 QR 图像填充您的/tmp

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

这对我很有效。

【讨论】:

您的图像生成正确吗?运行$pngAbsoluteFilePath路径中的脚本后能看到吗? (确保您不要取消喜欢该文件以进行测试)【参考方案2】:

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

【讨论】:

以上是关于phpqrcode + 将缓存文件保存到亚马逊而不是服务器上的文件夹的主要内容,如果未能解决你的问题,请参考以下文章

我在哪里将我的亚马逊 .pem 文件保存在 Mac 上

生成二维吗

高并发的处理方案

将php代码保存到文件中而不解释它

将 Matlab 输出保存到文件,而不是在屏幕上显示

将 Byte[] 解析为文件而不保存它