Как мне написать скрипт php для отображения изображения типа <img src = "/ img.php? ImageID = 32" />? - PullRequest
2 голосов
/ 16 сентября 2009

Я храню рекламные баннеры в таблице mysql, или я должен сказать только имя файла, например, «imagename.jpg» или «banner3.gif».

Очевидно, я хочу отслеживать, когда эти баннеры загружаются, поэтому я думаю создать php-файл с именем img.php и назвать его так:

<img src="/img/img.php?imageID=3" />

И это вытащит изображение с идентификатором 3 вместе с обновлением моей таблицы совпадений и т. Д.

Я знаю, как обновить таблицу совпадений ... но я пытаюсь понять, как кодировать файл img.php, чтобы он просто извлекал имя файла и выводил его на экран, чтобы он работал как обычное изображение.

Пока у меня есть ...

<?php
header("Content-Type: image/jpeg");
// insert my db connect file
// update the hits table etc

$sql = 'SELECT * FROM ads WHERE id="' . $_GET['imageID'] .  '" ';
$res = mysql_query($sql);

$row = mysql_fetch_array($res);

$image = '/img/' . $row['file'];

imagejpeg($image);

// and this is where I'm at...

?>

У меня есть некоторые проблемы с приведенным выше кодом, который я извлек из разных мест, чтобы попасть сюда. Изображения могут быть png / gif / jpg, в то время как тип содержимого заголовка, кажется, имеет место только для одного типа.

Есть ли способ, чтобы этот один файл работал нормально для нескольких типов изображений? Я думаю, что я должен сначала запросить таблицу, определить расширение файла, а затем вставить функцию заголовка на основе этого.

Но что я на самом деле делаю, когда у меня есть это право и я хочу, чтобы изображение тогда просто появлялось?

благодаря вашей помощи вот окончательный рабочий файл

<?php

// make sure we're only getting a number for the query b4 doing stuff
if(is_numeric($_GET['imid'])) {

include('thedbfile.php');

$types['jpg'] = 'image/jpeg';
$types['png'] = 'image/png';
$types['gif'] = 'image/gif';



$sql = 'SELECT file FROM ads WHERE id="' . $_GET['imid'] . '" ';
$res = mysql_query($sql);

$row = mysql_fetch_array($res);

$image = 'img/banners/' . $row['file'];

$extension = end(explode('.', $row['file']));


header('Content-Type: ' . $types[$extension]);

echo file_get_contents($image);


}

?>

Ответы [ 5 ]

2 голосов
/ 16 сентября 2009

Возможно, вы захотите сохранить содержимое изображения непосредственно в вашей базе данных.

Как вы сказали, вам нужно проанализировать тип содержимого из имени файла. Вы также можете добавить в свою базу данных поле с расширением.

$extension = end(explode('.', $row['file']));

Затем вы должны создать массив, который содержит тип содержимого заголовка:

$types['jpg'] = 'image/jpeg';
$types['png'] = 'image/png';

затем отправьте заголовок (вам нужно проверить, содержит ли массив types ключ extension и ошибку, если она не существует)

header('Content-Type: ' . $types[$extension]);

Затем загрузите ваше изображение с

echo file_get_contents($image);

Это должно сделать это. Обратите внимание, что вы действительно должны проверить, является ли параметр ImageID целым числом, из соображений безопасности:

if(!ctype_digit($_GET['ImageID'])) // error
2 голосов
/ 16 сентября 2009

вы можете попробовать header('Location: <URL-TO-IMAGE>'); после того, как закончите с изображением.

в качестве альтернативы, вы можете определить расширение по имени файла и затем вернуть соответствующий тип MIME.

function mime2ext($mime){
    $m = explode('/',$mime);
    $mime = $m[count($m)-1];
    switch($mime){
        case 'jpg': return 'jpg'; break;
        case 'jpeg': return 'jpg'; break;
        case 'pjpeg': return 'jpg'; break;
        case 'png': return 'png'; break;
        case 'gif': return 'gif'; break;
    }
    return '';
}

function ext2mime($fname){
    $ext = end(explode('.',$fname));
    switch($ext){
        case 'jpg': return 'image/jpeg'; break;
        case 'jpeg': return 'image/jpeg'; break;
        case 'png': return 'image/png'; break;
        case 'gif': return 'image/gif'; break;
    }
    return '';
}

относительно нескольких типов пантомимы, нет множества типов пантомимы. Будет отправлен только последний тип контента.

см

<?php
header('Content-Type: image/jpeg');
header('Content-Type: image/png');
header('Content-Type: image/gif');
?>

Тип содержимого image / gif.

2 голосов
/ 16 сентября 2009

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

//tell client abou tcontent type
header("Content-Type:image/jpeg");

//prevent caching
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
header ("Cache-Control: no-cache, must-revalidate");  // HTTP/1.1
header ("Pragma: no-cache");                          // HTTP/1.0

//how big is it?
header("Content-Length:".filesize($image));

//send image data
readfile($image);
2 голосов
/ 16 сентября 2009
echo file_get_contents($image);

Но я сомневаюсь, что ваши изображения на самом деле находятся в /img/ (верхний уровень иерархии файловой системы). И да, настройка Content-type после того, как вы знаете, какой тип вашего изображения звучит хорошо.

P.S. Вы немного расширили свой код, и я не знаю, что делает imagejpeg($image); -)

1 голос
/ 16 сентября 2009

В конце концов, вам просто нужно включить данные изображения в текст вашего сообщения вместе с нужным слушателем. Мой код выглядит так:

header("Content-type: $mime");
echo $this->mBinaryJunk;

Вам необходимо правильно установить тип $ mime в зависимости от фактического типа изображения. Вы можете сделать это, сохранив его при первоначальном поиске файла или обнаружив его по имени файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...