#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));
}
?>