Чтения Картинки!

Статус
В этой теме нельзя размещать новые ответы.

CnecHa3

Постоялец
Регистрация
10 Фев 2007
Сообщения
105
Реакции
20
вот есть код:
PHP:
<?php

include './inc/init.php';
$id = $db->safesql($_REQUEST['id']);
$type = (!isset($_REQUEST['type'])?'3':$db->safesql($_REQUEST['type']));
$db->query("SELECT `mainPhoto` FROM `user` WHERE `id`='$id'");
if($db->num_rows() > 0){
$i = $db->get_array();
$img = "./uploads/$id/mainPhoto/$type/".$i['mainPhoto'].".jpg";
}else{
$db->query("SELECT `gender` FROM `user` WHERE `id`='$id'");
$i = $db->get_array();
$img = "./images/no-photo-$type-".$i['gender'].".jpg";
}
header('Content-type: image/jpeg');
readfile($img);

по-идеи он должен выводить картинку как image/jpeg
а он мне выкидывает(бинарную шнягу) это:
Для просмотра ссылки Войди или Зарегистрируйся

Почему так? Что ни так? :)
 
Зачем такие сложности?
Не проще вместо
PHP:
header('Content-type: image/jpeg'); 
readfile($img)
сделать
PHP:
echo '<img src="'.$img.'" />[php]или обязательно нужен raw-вывод?

Такое только в опере или во всех браузерах?

PS пару раз натыкался на такой горбыль когда использовал буферизацию вывода и в буфер что-то клалось до картинки.
 
  • Заблокирован
  • #3
Зачем такие сложности?
Потому что к скрипту, скорее всего, обращаются примерно так:
<img class='avatar' src='/engine/getAvatar.php?743' />
:)

Сто пудов что-то кладется до картинки, точнее даже до заголовка картинки, потому что если бы браузер получил
header('Content-type: image/jpeg');
он бы пытался обработать поток и до поры-до времени ничего не выводил.
 
Спецназ, опять привет кстати:)
А теперь по делу:

header('Content-type: image/jpeg');
readfile($img);

меняем на:

PHP:
<?php 
$img  = realpath($img); //устанавливаем абсолютный путь к файлу - не тратим время на поиск файла потом
/* 
добавляем в массив значения, где:
 ключ - это расширение
 значение - это окончание функции обработки заголовков:
  пример:
   jpeg,jpg обрабатывает imagefromJPEG (получение содержимого картинки в виде указателя на ресурс), 
   imageJPEG - вывод в браузер картинки (как header(...)), или сохранение на жесткий диск
   расширение картинки (ключ массива) указываем для удобства в нижнем регистре (jpeg,jpg,png,gif)  
*/
$i_ext=array(
    'jpeg'=>'JPEG',
    'jpg'=>'JPEG',
    'png'=>'PNG',
    'gif'=>'GIF'
    );

if(is_file($img)&&is_readable($img)){ //проверяем есть ли такой файл вообще на серверере и доступен ли для чтения?
	$arr 	= false;
	$arr 	= getimagesize($img); //получаем информацию о картинке, если это вообще картинка, false иначе 
	$inf	= array();
	$inf 	= pathinfo($img);
	$ext    = '';
	$ext 	= strtolower($inf['extension']); //получаем расширение картинки в нижнем регистре
			unset($inf);//чистимся
	$keys 	= array();
	$keys	= array_keys($i_ext); //собираем все ключи - доступные расширения картинок в один массив 
	if($arr&&sizeof($arr)&&in_array($ext,$keys)){ //если массив данных - то картинка, и наше расширение присутствует в изначальном массиве 
			unset($keys,$ext);//чистимся
		$val = '';
		$val = $i_ext[$key]; //получаем нужное окончание для функций обработчика из массива для текущей картинки
			unset($key);
		$res = false;//чистимся
		$functionfromname   = 'imagecreatefrom'.$val; //подбираем имя функции для получения ресурса картинки
		$functionheadername = 'image'.$val;
			unset($val);//чистимся
		if(function_exists($functionfromname)&&function_exists($functionheadername)){ //проверяем, существуют ли угадываемые нами функции 
			$res = $functionfromname($img); //получаем указатель на ресурс картинки
			if($res&&is_resource($res)){ //если это верный указатель на ресурс 
				$functionheadername($res);//выводим картинку в браузер
			}	
		} 
	}
}   $res = null; //чистимся
	unset($img,$arr,$res,$functionfromname,$functionheadername,$i_ext); //чистимся
?>
Должно работать.
 
Зачем такие сложности?
Потому что к скрипту, скорее всего, обращаются примерно так:
<img class='avatar' src='/engine/getAvatar.php?743' />
:)
ага имено так))

Black#FFFFFF - привет)) довно я тут небыл :D
сейчас проверю)) зарания спасибо ПХП ГУРУ :yahoo:
 
Black#FFFFFF, то что доктор прописал!
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху