Проблема с типом содержимого PHP Image - PullRequest
1 голос
/ 05 января 2011

У меня есть конкретная проблема, и я не могу ее преодолеть.

Для моего последнего проекта мне нужен простой скрипт PHP, который отображает изображение в соответствии с его идентификатором, отправленным через URL.Вот код:

header("Content-type: image/jpeg");
$img = $_GET["img"];
echo  file_get_contents("http://www.somesite.hr/images/$img");

Проблема в том, что изображение не отображается, хотя браузер распознает его (я вижу его в заголовке страницы), вместо этого я распечатываю URL изображения.

Он не работает ни на сервере с разрешенным удаленным доступом, ни на сервере без него.Кроме того, перед заголовком ничего не печатается и не отображается.

Интересно, это ошибка типа контента или что-то еще.Заранее спасибо.

Ответы [ 6 ]

3 голосов
/ 05 января 2011

Возможно, изображение не помещается в память. Или ваша установка PHP не имеет разрешения для выполнения внешних HTTP-вызовов. В любом случае, я предлагаю вам никогда не использовать echo file_get_contents (), вместо этого используйте readfile . Также вы никогда не должны использовать необработанные строки из $ _GET или $ _POST для файловых операций. Всегда удаляйте нулевые байты, косые черты и двойные точки из предоставленных пользователем имен файлов, или, что еще лучше, разрешайте только буквенно-цифровые символы.

2 голосов
/ 05 января 2011

Я делал что-то подобное недавно, но нашел это медленным методом (я делал 15+ на странице). Это медленно, потому что сначала ваш сервер должен загрузить изображение, а затем отправить его клиенту. Это означает, что для каждого изображения оно загружается дважды.

Я придумал альтернативу - перенаправление. Это позволило клиентским машинам напрямую обращаться к другому сайту, скрывая реальный URL в исходном коде HTML.

$ r - обрабатывается над сценарием и проверяется, чтобы убедиться, что все в порядке.

$webFile = 'http://www.somesite.com/'.$r['type'].'/'.$r['productid'].'.jpg';
header('Location: '.$webFile);
exit();

Конечно, если кто-то поместит мой URL-адрес изображения в адресную строку, он будет перенаправлен, и пользователь увидит настоящий URL-адрес, но это ускорит мою страницу, и я не слишком беспокоюсь об этом.

1 голос
/ 05 января 2011

Вы хотите убедиться, что ваш скрипт не выводит пробелов. Проверяйте до и после открытия / закрытия тегов PHP.

Если это подтвердится, вы должны убедиться, что allow_url_fopen установлено в On в php.ini

0 голосов
/ 05 января 2011

Убедитесь, что переменная существует в строке запроса, и используйте регулярное выражение, чтобы убедиться, что она не содержит ничего, кроме буквенно-цифровых символов или точки.Затем используйте readfile () для потоковой передачи вывода в браузер.

// make sure the variable exists
if (isset($_GET['image'])) {
    $image = $_GET['image'];
    // make sure it contains only letters, numbers, the underscore, and a period
if (preg_match('/^[\w.]+$/', $image)) {
    $file = "http://www.example.com/images/$image";
    // send the correct header
    header('Content-type: image/jpeg');
    // stream the output
    readfile($file);
    }
}
0 голосов
/ 05 января 2011

Вероятно, вы получаете некоторые ошибки, и изображение не отображается. Попробуйте сначала отключить такие ошибки:

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'Off');
0 голосов
/ 05 января 2011

попробуйте встроить ваш php-файл, который получает изображение как <img> в ваш html

getImage.php

header("Content-type: image/jpeg");
$img = $_GET["img"];
echo  file_get_contents("http://www.somesite.hr/images/$img");

в ваш html-файл

<img src="getImage.php?img=IMAGEID">
...