从Google POST请求中保存PNG

时间:2011-10-12 20:37:24

标签: php stream

我有一段简单的代码,可以将来自Google帖子请求的流作为PNG输出。这是使用谷歌创建QRcode。我想要做的是将其保存为我的服务器上的PNG文件,我似乎无法弄清楚如何解决它,因为我对使用流不太熟悉。这是代码:

<?php

    //This script will generate the slug ID and create a QRCode by requesting it from Google Chart API
    header('content-type: image/png');

    $url = 'https://chart.googleapis.com/chart?';
    $chs = 'chs=150x150';
    $cht = 'cht=qr';
    $chl = 'chl='.urlencode('Hello World!');

    $qstring = $url ."&". $chs ."&". $cht ."&". $chl;       

    // Send the request, and print out the returned bytes.
    $context = stream_context_create(
        array('http' => array(
            'method' => 'POST',
            'content' => $qstring
    )));
    fpassthru(fopen($url, 'r', false, $context));

?>

2 个答案:

答案 0 :(得分:2)

这是一种方法,根据您的代码并指定'将其另存为我的服务器上的PNG文件':

<?php
$url = 'https://chart.googleapis.com/chart?';
$chs = 'chs=150x150';
$cht = 'cht=qr';
$chl = 'chl='.urlencode('Hello World!');

$qstring = $url ."&". $chs ."&". $cht ."&". $chl;       

$data = file_get_contents($qstring);

$f = fopen('file.png', 'w');
fwrite($f, $data);
fclose($f);

添加错误检查等。

答案 1 :(得分:1)

要将结果写入文件,请使用fwrite()而不是fpassthru()。

您可以使用file_get_contents()和file_put_contents(),但这些需要将整个图像存储在字符串中,这对于大图像来说可能是内存密集型的。这不是问题,因为qrcode图像很小,但总的来说值得思考。

您实际上不需要创建流上下文,因为Web服务可以通过HTTP GET而不是POST工作。

还有一个名为http_build_query()的函数,您可以使用它来简化URL的构建。

<?php

$url = 'https://chart.googleapis.com/chart?' . http_build_query(array(
    'chs' => '150x150',
    'cht' => 'qr',
    'chl' => 'Hello World!'
));

$src = fopen($url, 'rb');
$dst = fopen('file.png', 'w');
while (!feof($src)) {
    fwrite($dst, fread($src, 1024));
}

?>