【问题标题】:Saving PNG from Google POST request从 Google POST 请求中保存 PNG
【发布时间】:2011-10-12 20:37:23
【问题描述】:

我有一段简单的代码可以将来自 google post 请求的流输出为 PNG。它用于使用谷歌创建二维码。我想要做的是将它保存为我的服务器上的 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));

?>

【问题讨论】:

  • 必须是帖子吗?生成的 url 可以作为一个简单的 GET 请求正常工作,这意味着您可以改用 echo file_get_contents(...)
  • 它可以是一个获取请求,但我仍然不确定如何保存它。 code.google.com/apis/chart/infographics/docs/overview.html
  • file_put_contents('qr.png', file_get_contents(...)); fpassthru() 用于将输出直接发送到客户端。对于您的代码,您需要 fwrite() 代替之前打开的文件句柄。
  • 啊,好的,我已经成功了!容易多了!我试图将流变成字符串并且真的很难摔跤。执行简单的 URL 获取请求有效。我将发布代码作为答案。

标签: php stream


【解决方案1】:

这是一种方法,基于您的代码并指定“将其保存为我的服务器上的 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);

添加错误检查等。

【讨论】:

  • 请告诉我如何创建带有徽标的二维码
  • 嗨,Daren,它工作得很好。但是我怎样才能添加我的这个条形码图像的标志中心。有什么想法请分享
【解决方案2】:

要将结果写入文件,请使用 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));
}

?>

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 2019-09-05
    • 2021-03-02
    • 1970-01-01
    • 2023-01-23
    • 2015-07-10
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多