Сохранение PNG из запроса Google POST

#php #stream

#php #поток

Вопрос:

У меня есть простой фрагмент кода, который выводит поток из запроса Google post в формате PNG. Это для использования Google для создания QR-кода. Что я хочу сделать, так это сохранить это как файл 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 ."amp;". $chs ."amp;". $cht ."amp;". $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));

?>
  

Комментарии:

1. Обязательно ли это должно быть post? Сгенерированный URL-адрес отлично работает как простой запрос GET, что означает, что вы могли бы просто использовать echo file_get_contents(...) вместо этого.

2. Это может быть запрос get, но все же я не уверен, как бы я его сохранил. code.google.com/apis/chart/infographics/docs/overview.html

3. file_put_contents('qr.png', file_get_contents(...)); fpassthru() предназначен для отправки выходных данных непосредственно клиенту. Для вашего кода вместо этого вы хотели бы использовать fwrite() для дескриптора файла, открытого ранее.

4. Ах, хорошо, у меня все работает! Намного проще! Я пытался преобразовать поток в строку, и мне действительно было трудно бороться с этим. Выполнение простого запроса на получение URL-адреса сработало. Я опубликую код в качестве ответа.

Ответ №1:

Это один из способов, основанный на вашем коде и указанный «сохранить это как файл PNG на моем сервере»:

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

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

$data = file_get_contents($qstring);

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

Добавить проверку ошибок и т.д. по вкусу.

Комментарии:

1. пожалуйста, дайте мне знать, как я могу создать qr-код с логотипом

2. Привет, Дарен, все работает отлично. Но как я могу добавить свой логотип в центр этого изображения штрих-кода. любая идея, пожалуйста, поделитесь

Ответ №2:

Чтобы записать результат в файл, используйте fwrite() вместо fpassthru().

Вы могли бы использовать file_get_contents() и file_put_contents(), но для этого требуется сохранить все изображение в виде строки, что может занять много памяти для больших изображений. Здесь это не проблема, поскольку изображения qrcode небольшие, но в целом об этом стоит подумать.

На самом деле вам не нужно создавать контекст потока, поскольку веб-служба будет нормально работать с 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));
}

?>