У меня есть PHP-скрипт, который извлекает изображение с удаленного сервера, чтобы я мог манипулировать им с помощью HTML5 canvas API.
<?php if ((isset($_GET['url']))) { $url = $_GET['url']; $file_format = pathinfo($url, PATHINFO_EXTENSION); try { header("Content-Type: image/$file_format"); header("Content-disposition: filename=image.$file_format"); $img = file_get_contents($url); echo $img; } catch(Exception $e) { echo $e->getMessage(); } } else die('Unknown request'); ?>
Типичный запрос будет выглядеть так:
fetch_image.php?url=http://example.com/images/image.png
Все работает нормально на моем локальном сервере, но производственный сервер дает мне эту ошибку:
NetworkError: 500 Внутренняя ошибка сервера.
Журнал ошибок регистрирует это сообщение:
PHP Предупреждение. Невозможно изменить информацию заголовка – уже отправленные заголовки.
Я пробовал некоторые из предложений, но не работал:
allow_url_fopen = 1
Убедитесь, что сервер позволяет открывать удаленные URL-адреса с файловыми функциями (настройка php.ini allow_url_fopen должна быть «истина»).
Пытаться
ob_start()
в начале и в
ob_end_flush()
в конце скрипта. Также убедитесь, что сценарий не содержит символов перед <?php
.
Вы должны убедиться, что ваш хостинг-провайдер не отключил удаленный выбор URL из соображений безопасности. Параметр allow_url_fopen
и вы можете проверить текущую конфигурацию с помощью phpinfo () . В таком случае file_get_contents () должен возвращать FALSE
поэтому вы должны проверить $img
на false с оператором ===
.
Попробуйте этот путь
<?php if ((isset($_GET['url']))) { $url = $_GET['url']; $file_format = pathinfo($url, PATHINFO_EXTENSION); try { ob_clean(); ob_start(); header("Content-Type: image/$file_format"); header("Content-disposition: filename=image.$file_format"); $img = file_get_contents(urlencode($url)); // as per manual "If you're opening a URI with special characters, such as spaces, you need to encode the URI with urlencode(). " echo $img; echo ob_get_clean(); exit(); } catch(Exception $e) { echo $e->getMessage(); } } else die('Unknown request'); ?>
еще одно решение из руководства
Иногда вы можете получить сообщение об ошибке с URL-адресом http. даже если вы установили «allow_url_fopen = On» в php.ini
Для меня решение было также установить «user_agent» на что-то.
Заголовки отправляются при запуске вывода содержимого. Итак, где-то перед кодом, который вы поставили выше, контент получает эхо (от PHP или простой HTML или javascript). Вам нужно выследить, где это происходит.