php файл като картинка

webdeveloper

Registered
Мъча се да направя нещо, но идея си нямам как точно. Искам да показвам картинки с <img src=""> тага, но не от директен линк като site.com/images/kartinka.jpg, а от PHP файл (пример: saita.com/view.php?file=kartinka.jpg). Знам, че трябва с header да се направи, но не ми се е налагало до сега да се занимавам с подобно нещо и не са ми ясни нещата. Имайте в предвид, че от този файл ще се извикват следните формати:

jpg,gif,png,bmp,ico

Картинките се записват и в база данни.


Та, да имате някакви предложения как да го постигна? :idea:
 
smoke каза:
PHP:
<?php header("Content-Type: image/jpg"); ?>

Това го знам, ама нататък? Аз хубаво ще извадя картинката от базата и местоположението и на съръва, но как да я дефинирам, а и ако не е jpg?
 
Не става много ясно от обясненията ти къде запазваш картинката - в базата данни или като файл на сървъра. И какво точно запазваш в базата данни - файла или само пътя до файла?

Кода, който ти е дал smoke се допълва още малко, в този случай приемаме, че картинката е запазена като файл на сървъра:

Код:
<?php 
header("Content-Type: image/jpg"); 
readfile('/path/to/kartinka.jpg');
?>

Относно другия ти въпрос - ако картинката не е jpg - сменяш последната част на header-a, MIME type, с правилния - image/png, image/gif.....

Как да вземеш MIME типа? Зависи от версията на РНР с която разполагаш

PHP 5.3+ http://bg.php.net/manual/en/function.finfo-file.php
pre PHP 5.3 http://bg.php.net/manual/en/function.mime-content-type.php

или ако ти е по-лесно, просто вземи разширението на файла
 
Така няма ли да е много неопримизирано? При едни 50 зявки в секунда към картинката, дали няма да умре сървъра...?

Т.е. readfile не отнема ли много ресурси?
 
Така е, readfile отнема ресурси и натоварва сървъра. Тук е мястото на въпроса, защо искаш да показваш картинката през РНР файл, след като я имаш физически на сървъра и след като, вероятно, няма да правиш нищо по самата картинка като добавяне на watermark и т.н., защо не я сложиш директно в src атрибута на img. Но ти си решаваш, въпроса ти беше как да покажеш картинка през РНР файл. За същата цел би могло да се използва GD или ImageMagic, но там ресурсите ще са още повече.

Дали ще умре сървъра? Едва ли, но зависи от големината на картинките, ако при upload преоразмеряваш картинката до нормални размери, вероятно всичко ще е ОК. Ако се опитваш да зареждаш снимки от по няколко мегабайта едната, може да имаш проблеми с хостинга.
 
Целта ми е да не се вижда папката в която се намира и евентуално да наложа трафик лимит върху картинката или въобще искам да имам контрол над достъпа и.

Забелязвам, че същото нещо го има в системата "CF Image Hosting", но при нея не забелязвам забавяне или натоварване на сървъра когато снимката се извика чрез php файл.


Ето я функцията на CF Image:

PHP:
function imageAddress($imgType,$image,$linktype=null){
	global $DIR_THUMB,$DIR_THUMB_MID,$DIR_IMAGE,$settings;

	$ext = 'html';
	$thumb_ext = isset($image['ext'])?strtolower($image['ext']):'';
	switch($imgType){
		case 1:
			$ext = $thumb_ext;
			if ($ext!='html')$fileaddress = $DIR_IMAGE.$image['id'].'.'.$ext;
			if (!isset($fileaddress) || !file_exists($fileaddress)) return false;
			break;
		case 2:
			$fileaddress = $DIR_THUMB_MID.$image['id'].'.';
			if($linktype=='dm')$ext = $thumb_ext;
			if(!file_exists($fileaddress.$thumb_ext)) $notfound =1;
			else $fileaddress .= $thumb_ext;
			break;
		case 3:
			$fileaddress = $DIR_THUMB.$image['id'].'.';
			if($linktype=='dt')$ext = $thumb_ext;
			if(!file_exists($fileaddress.$thumb_ext)) $notfound =1;
			else $fileaddress .= $thumb_ext;
			break;
		case 4:
			$ext = $thumb_ext;
			$fileaddress = $DIR_IMAGE.$image['id'].'.'.$ext;
			if (!isset($fileaddress) || !file_exists($fileaddress)) return false;
			break;
	}

// look for the right file ext
	if(isset($notfound)){
		foreach (array('png','jpg','jpeg','gif') as $fileExt){
			if ($thumb_ext != $fileExt && file_exists($fileaddress.$fileExt)){
				$fileaddress .= $fileExt;
				if($linktype=='dt' || $linktype=='dm') $ext = $fileExt;
				break;
			}
		}
	}

	if (isset($fileaddress)){
		if (!is_null($linktype)){
			if($settings['SET_MOD_REWRITE']){
				return $settings['SET_SITEURL'].'/'.$linktype.'-'.$image['id'].'.'.$ext;
			}else{
				return $settings['SET_SITEURL'].'/?'.$linktype.'='.$image['id'];
			}
		}
		elseif (is_null($linktype)){
			return $fileaddress;
		}
	}
	return false;
}


И вече линка към картинката се генерира така:

$imgurl = imageAddress(1,$image,'di');

А адреса е такъв:

index.php?di=P2N0U

Като P2N0U е името на картинката.
 
Функцията, която си показал, има за цел да генерира линка към картинката, не да покаже картинката.

Функцията, която показва картинката се казва loadImage(), намира се в същия config.php файла на тази система и използва:

Код:
header('Content-type: image/png');
readfile('img/notfound.png');
exit();

Едит: Извинявай, малко не доглеждам нещата, но общо взето използват readfile плюс няколко проверки за това дали картинката е нова, дали пък вече не е кеширана от браузъра и така избягват повторното изпращане и спестяват трафик и натоварване на сървъра. Прегледай детайлно функцията loadImage
 

Back
Горе