PHP сохраняет файл png как 0 байт на диск

Мое намерение - сохранить сгенерированное изображение кода qr на моем локальном компьютере.

Я уже проверил весь вопрос о стеке по этому поводу. Однако они не помогли мне решить эту ошибку.

<?php 
    header('Content-type: image/png');

    $filename = "./qrs/qr-6234/qr.png";
    $link = "https://stackoverflow.com";
    $size = 250;
    $url = urlencode ( $link );
    $qr_url = "http://chart.googleapis.com/chart?chs=$sizex$size&cht=qr&chld=L|0&chl=$url&choe=UTF-8";  
    $qr = file_get_contents($qr_url);
    $imgIn = imagecreatefrompng ($qr);
    $imgOut = imagecreate ( $size, $size );
    imagecopy ( $imgOut, $imgIn, 0, 0, 0, 0, $size, $size );
    imagepng ( $imgOut, $filename, 9);
    imagedestroy ( $imgIn );
    imagedestroy ( $imgOut );
?>

Я не знаю почему, но это дает мне файл png с нулевым байтом.

Редактировать: благодаря ishagg я получил журналы ошибок. Эти ;

Warning: file_get_contents(): http:// wrapper is disabled in the server configuration by allow_url_fopen=0 in ./qr/qr_txt_test.php on line 10

Warning: file_get_contents(http://chart.googleapis.com/chart?chs=250&cht=qr&chld=L|0&chl=https%3A%2F%2Fstackoverflow.com&choe=UTF-8): failed to open stream: no suitable wrapper could be found in ./qr/qr_txt_test.php on line 10

Warning: imagecreatefromstring(): Empty string or invalid image in ./qr/qr_txt_test.php on line 11

Warning: imagecopy() expects parameter 2 to be resource, boolean given in ./qr/qr_txt_test.php on line 13

Warning: imagepng(): gd-png error: no colors in palette in ./qr/qr_txt_test.php on line 14

Warning: imagedestroy() expects parameter 1 to be resource, boolean given in ./qr/qr_txt_test.php on line 15

person ziLk    schedule 14.10.2017    source источник


Ответы (1)


Если вы удалите вызов header(), вы сможете увидеть ошибки в скрипте.

В вашем их два:

  • Переменная $sizex, используемая в $qr_url, не определена.
  • Чтобы создать новое изображение из внешнего ресурса, вам нужно использовать imagecreatefromstring().

После исправления этих двух ошибок код работает правильно:

<?php
header('Content-type: image/png');
$filename = "qr.png";
$link = "https://stackoverflow.com";
$size = 250;
$url = urlencode ( $link );
$qr_url = "http://chart.googleapis.com/chart?chs=$size&cht=qr&chld=L|0&chl=$url&choe=UTF-8";  
$qr = file_get_contents($qr_url);
$imgIn = imagecreatefromstring($qr);
$imgOut = imagecreate ( $size, $size );
imagecopy ( $imgOut, $imgIn, 0, 0, 0, 0, $size, $size );
imagepng ( $imgOut, $filename, 9);
imagedestroy ( $imgIn );
imagedestroy ( $imgOut );

Результат:

qr изображение

person ishegg    schedule 14.10.2017
comment
Спасибо за ваш отзыв. Я изменил свой код на ваш. к сожалению, результат тот же. Это дало мне файл qr.png с нулевым байтом. - person ziLk; 14.10.2017
comment
Попробуйте снова удалить вызов header(), какие ошибки вы получаете? - person ishegg; 14.10.2017
comment
Я не вижу журнал ошибок на своей странице. Возможно, администратор отключил отображение журналов ошибок. У меня нет доступа к файлу php.ini:/ - person ziLk; 14.10.2017
comment
Добавьте это вверху страницы: ini_set("display_errors", "On"); error_reporting(E_ALL); - person ishegg; 14.10.2017
comment
Боже мой!, есть несколько предупреждающих сообщений. Большое спасибо за Вашу помощь! - person ziLk; 14.10.2017
comment
Это не проблема, брат. Если у вас есть еще сомнения, не стесняйтесь спрашивать. Только, если они слишком отличаются от исходного вопроса, возможно, задайте новый, чтобы все было аккуратно. Удачи! - person ishegg; 14.10.2017
comment
@Zilk Я видел, как ты редактировал. Все ошибки связаны с первой: вы не можете получить внешние ресурсы с помощью file_get_contents() из-за конфигурации вашего сервера. Если вы не можете изменить allow_url_fopen на On (что, я думаю, вы не можете), посмотрите этот ответ - person ishegg; 14.10.2017
comment
Большое вам спасибо за вашу помощь. - person ziLk; 14.10.2017