webForumDet fria alternativet

OOP och finfo

9 svar · 950 visningar · startad av dreas

dreasMedlem sedan jan. 2004140 inlägg
#1

Hej,

Jag försöker läsa in och köra en PHP klass som hanterar uppladdning av bilder. Jag kör OOP med inläsning av följande rader för hanteringen av klasserna (raderna finns i en fil som jag kallar "_global_.php"):

try {
	$pdh = new PDO("mysql:host=" . constant("DBHOST") . ";dbname=" . constant("DBNAME"), constant("DBUSR"), constant("DBPWD")); 
} catch(exception $e) {
	echo 'Error, felmeddelande: ',  $e->getMessage(), "\n";
}

function __autoload($class_name) {
    require_once '../lib/' . $class_name . '.php';
}

I upload klassen används finfo för att hantera bilden som kommer in, men det är här det kör ihop sig. Troligen så är det ngt i min _global_.php som gör att finfo inte vill vara med i leken. Får följande felmeddelande:

Warning: require_once(../lib/finfo.php) [function.require-once]: failed to open stream: No such file or directory in /_global_.php on line 10

Fatal error: require_once() [function.require]: Failed opening required '../lib/finfo.php' (include_path='.:/usr/local/lib/php') in /_global_.php on line 10

Någon som vet hur jag kommer runt felet eller vad som knasar sig?

MeleaMedlem sedan juli 20033 147 inlägg
#2

__autoload() laddar in filer som har samma namn som klassen. Så min gissning är att _global_.php inte har en klass som heter _global_ i sig.

dreasMedlem sedan jan. 2004140 inlägg
#3

Hmm, nu vet jag inte riktigt ifall jag är med på vad du menar.
Ska _global_.php ha en klass som heter _global_?

__autoload() funktionen använder jag för att läsa in alla resterande klasser efter att ha inkluderat _global_.php.

Exempel:

include("__db__config.php");
include("__global__.php");

$Product 		= new Product($pdh);
$Category		= new Category($pdh);

Detta har ju fungerat hur bra som helst, tills finfo kom in i bilden. Därför förstår jag inte varför det skulle behöva finnas en _global_ klass? Är det inte finfo funktionen som min _global_ tror är/körs som en klass?

MeleaMedlem sedan juli 20033 147 inlägg
#4

Aha, missförstod dig, sorry. :)

Felmeddelandet du får betyder att den inte hittar finfo.php, sökvägen är alltså fel.
Hur ser sökvägen ut där du inkluderar finfo.php?

dreasMedlem sedan jan. 2004140 inlägg
#5

Inga problem, uppskattar bara att ngn tar sig tid! :)

Tror att du missförstår mig igen dock.

finfo är alltså ingen fil eller include, utan det är en funktion/metod inbyggd i PHP (se http://se2.php.net/manual/en/function.finfo-file.php)

Jag tar dock ut den del som innehåller finfo, av klassen class.upload.php som hanterar en uppladdad fil/bild:

 if (function_exists('finfo_open')) {
                    $f = @finfo_open(FILEINFO_MIME, getenv('MAGIC'));
                    if (is_resource($f)) {
                        $mime = finfo_file($f, realpath($this->file_src_pathname));
                        finfo_close($f);
                        $this->file_src_mime = $mime;
                        $this->log .= '- MIME type detected as ' . $this->file_src_mime . ' by Fileinfo PECL extension<br />';
                    }
                } elseif (class_exists('finfo')) {
                    $f = new finfo( FILEINFO_MIME );
                    $this->file_src_mime = $info->file(realpath($this->file_src_pathname));
                    $this->log .= '- MIME type detected as ' . $this->file_src_mime . ' by Fileinfo PECL extension<br />';
                }

Och det är här jag tror det går snett;
$f = new finfo( FILEINFO_MIME );

"new finfo();" ser ju precis ut som om man initierar en ny klass, därför slukar nog min __autoload(); funktion även denna som en klass. Är jag på rätt spår tror ni?

Frågan är hur man ska gå runt det. Ska se ifall jag kan göra en variant att man skickas till en ny sida där inte __autoload finns, som hanterar uppladdningen. Ser gärna bättre förslag dock!

DufferMedlem sedan mars 2003429 inlägg
#6

Hej,
Dum fråga kanske, men du har väl PECL installerat på din server?

Mvh
Tobias

dreasMedlem sedan jan. 2004140 inlägg
#7

Hmmm.. absolut ingen dum fråga Duffer, jag hade totalt missat den kommentaren i koden. Är osäker på ifall PECL är installerat, har sidan på Binero - någon som kanske vet? Annars blir det ett telefonsamtal imorgon

Märkligt att det inte står något om PECL från den källa där jag hitta denna upload klass:
http://www.verot.net/php_class_upload.htm

Ska undersöka det lite närmare, men det är ingen som har ett förslag på en annan PHP klass för bild uppladdning och manipulering?

DufferMedlem sedan mars 2003429 inlägg
#8

Bäst vore det väl för dig om de ville bjuda på en installation av PECL's Fileinfo annars kan du ju modifiera din kod och använda mime_content_type() http://se2.php.net/manual/en/function.mime-content-type.php istället.
Så det är inte kört om de nu inte skulle ordna detta ;-)

Mvh
Tobias

pulseMedlem sedan nov. 200373 inlägg
#9

Prova modifera din autoload till:

function __autoload($class_name) {
	if(class_exists($class_name, false){
		return;
	}
    	require_once '../lib/' . $class_name . '.php';
}

Jag har aldrig använt finfo men det verkar vara många som har problem med den om man läser kommentarerna i manualen. GD är bra för att hantera bilder:
http://se2.php.net/gd

dreasMedlem sedan jan. 2004140 inlägg
#10

Tack för svaren!
Din variant fungerade inte pulse, och jag var inne och provade din modifering Duffer men fick fel trots allt. I och med lite pressad tidsschema, valde jag att bygga vidare på ett äldre script som inte är lika kraftfullt.

Jag får kika närmare på Duffers mime_content_type() lösningen till nästa projekt! :)

139 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)