Я сохраняю баннерную рекламу в таблице mysql, или я должен сказать только имя файла, например: «imagename.jpg» или «banner3.gif».
Очевидно, что я хочу отслеживать загрузку этих баннеров, поэтому я собираюсь создать php-файл под названием img.php и называть его так
<img src="/img/img.php?imageID=3" />
И это вытащит изображение с id 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); } ?>
в<?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); } ?>
Вы можете захотеть сохранить содержимое изображения непосредственно в своей базе данных.
Как вы сказали, вам нужно проанализировать тип содержимого из имени файла. Вы также можете добавить поле в свою базу данных, которое содержит расширение.
$extension = end(explode('.', $row['file']));
Затем вам нужно создать массив, который содержит тип содержимого заголовка:
$types['jpg'] = 'image/jpeg'; $types['png'] = 'image/png';
затем отправьте заголовок (вы захотите проверить, содержит ли массив типов ключ расширения и ошибку, если это не так)
header('Content-Type: ' . $types[$extension]);
Затем загрузите изображение с помощью
echo file_get_contents($image);
Это должно сделать это. Обратите внимание, что вам действительно нужно проверить, является ли параметр ImageID целочисленным по соображениям безопасности:
if(!ctype_digit($_GET['ImageID'])) // error
echo file_get_contents($image);
Но я сомневаюсь, что ваши изображения действительно находятся в /img/
(верхний уровень иерархии файловой системы). И да, настроив Content-type
после того, как вы знаете, какой тип вашего изображения звучит хорошо.
PS вы немного расширили свой код, и я понятия не имею, что такое imagejpeg($image)
😉
вы можете попробовать 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 ''; }
в отношении множественного типа mime нет множественного типа mime. Будет отправлен только последний Content-Type.
видеть:
<?php header('Content-Type: image/jpeg'); header('Content-Type: image/png'); header('Content-Type: image/gif'); ?>
Тип контента – image / gif.
Что-то вроде этого гарантирует, что вы правильно доставляете изображение и убедитесь, что оно не кэшировано, так что перезагрузка страницы вызовет новую выборку …
//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 MYH: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);
В конце вам просто нужно повернуть данные изображения в теле сообщения вместе с правильным слушателем. Мой код выглядит так:
header("Content-type: $mime"); echo $this->mBinaryJunk;
Вам нужно правильно установить тип $ mime на основе фактического типа изображения. Вы можете сделать это, сохранив его, когда оригинал найдет файл или обнаружите его из имени файла.