Hier ben ik weer met een (waarschijnlijk simpele) vraag:
Ik zou in mijn header.phtml (te vinden onder /myProject/application/view/scripts) willen controleren of een bestand in /myProject/public/media/images/ bestaat. Via mijn controller heb ik aan mijn view de base_url meegegeven.
In header.phtml heb ik dus de url beschikbaar /myProject/public/media/images.
Als ik echter via file_exists controleer of het bestand in die folder bestaat, krijg ik steeds False en het bestand bestaat wel degelijk.
Na enig opzoekwerk heb ik reeds gevonden dat dit blijkbaar ergens met de php version te maken kan hebben (ik gebruik 5.3.5).
Doe eens een echo van de output van de functie PHP.net: getcwd. Plak er je base_url achter en als dit juist verwijst (wat waarschijnlijk niet het geval zal zijn ) moet je maar eens je code en de output hier geven.
De directory is niet verkeerd. Heb nu in dezelfde folder een andere foto toegevoegd genaamd 0.jpg.
Verder is er nu een if-structuur dat wanneer file_exists false geeft bij controle van 2.jpg in die directory, hij 0.jpg moet laten zien uit dezelfde directory (structuur van URL is zelfde opgebouwd) en dat doet hij correct.
Alle PHP code wordt vanuit je public directory gerund (want alles wordt naar index.php doorverwezen). Dus, wanneer je moet controleren of het bestand in '/myProject/public/media/images/' bestaat, moet je controleren op 'media/images/bestand.extensie'.
Tenminste indien je relatieve paden (relatief vanuit public/) gebruikt. Je kan ook voor het absolute pad (begint met '/' of 'X:\' op windows met X je schijfletter) gaan.
dan kan je eerst __DIR__ ophalen om de directory van header.phtml op te halen en daarna terug omhoog werken (naar myProject/) en terug naar beneden naar je images folder.
Het pad zelf is geen probleem vermoed ik, want als ik ze in mijn img-tag zet wordt de afbeelding correct weergegeven. Op de php.net pagina van file_exists (http://php.net/manual/en/function.file-exists.php) zie ik nog een post (15-Mar-2005 11:59) die zegt dat in safe_mode file_exists steeds false zal teruggeven.
Net even gecontroleerd en safe_mode staat op 0, dus dat is ook het probleem niet...
Safe mode is deprecated in PHP 5.3 dus dat is het wellicht niet.
Volgens mij kan je wel geen bestanden controleren op existentie met behulp van file_exists(). Die methode werkt enkel voor relatieve en absolute bestandsnamen (ook op netwerk shares) maar niet voor http(s).
... veronderstellende dat dit in je viewScript is en je de viewhelpers ServerUrl en BaseUrl kan gebruiken (anders kan je nog steeds je eigen, bovenstaande methode gebruiken ;))
Ik weet wel niet exact of die view-helpers slashes zetten en waar ze die slashes zetten (vooraan of achteraan xUrl). Dus dat moet je ff checken door een echo'tje
Resultaat: ook al bestaat bv. 22.jpg in de /media/images folder, toch geeft de file_exists false en zal hij de 0.jpg (in dezelfde folder) nemen.
Voor mij lijkt het dan dat het path ($full) niet het probleem mag geven aangezien ik een identiek path gebruik voor de 0.jpg en hij het daar wel correct doet.
Gevolg: wanneer mijn url enkel bestaat uit de controller naam (e.g. http://myDomain/myProject/public/controller) geeft hij de afbeeldingen correct weer (dus ok voor file_exists), maar wanneer de url ook een action bevat (http://myDomain/myProject/public/controller/home) geeft hij ze niet meer weer. Vermoedelijk omdat het path dan niet meer correct is en ik dus eigenlijk 1 map omhoog zou moeten gaan (../) om ze te laten zien.
Weet je per toeval nog een manier hoe ik kan zien of mijn url enkel uit de controller bestaat of ook een action heeft?
Het path is normaal gezien niet afhankelijk van je controllers. Tenminste, als je rewrite rules deftig zijn opgesteld.
ZF maakt wel links die lijken op mappenstructuren, maar het zijn geen mappenstructuren.
De .htaccess in je public folder zorgt ervoor dat je apache server het volgende doet.
1. Apache kijkt of je URL een pad is naar een bestand dat bestaat (dus een link die geen 404 zou opleveren).
2. Als de link geen geldig pad is, wordt alles dat na de map komt waarin je .htaccess-bestand zit beschouwd als parameter-string. ZF ontbindt die dan volgens het patroon (<module>/)(<controller>(/<action>(/<param_key>/<param_value>(/...))))
Dus, als je .htaccess zijn werk doet, mag de URL geen vat hebben op de locatie van je bestanden. Ik raad je aan om eens al je paden te echo-en of var_dump'en in je view-script.
Als er je dan niets opvalt, moet je eens de output hier plakken voor enkele controllers en actions (index/index, index/niet-index-action, niet-index-controller/index en niet-index-controller/niet-index-action).
Bedankt voor je antwoord, hiermee ben ik bijna waar ik moet zijn.
Blijkbaar was het niet enkel de file_exists dat niet werkt, maar ook de upload-functie uit mijn controller.
$this->view->msg.='Enkel jpg/jpeg fotos kleiner dan 2Mb zijn toegelaten.';
$error=1;
}
}
Gevolg, $doelDirectory bevat mijn path (myProject/public/media/images/) maar het resultaat van de move_uploaded_file is leeg en de file wordt dus niet geupload.
Wanneer ik in mijn pagina-source ga kijken, zie ik 2 warning:
<b>Warning</b>: move_uploaded_file(/myProject/public/media/images/22.jpg) [<a href='function.move-uploaded-file'>function.move-uploaded-file</a>]: failed to open stream: No such file or directory in <b>/home/domain/myDomain/myProject/application/controllers/Controller.php</b> on line <b>178</b><br />
<b>Warning</b>: move_uploaded_file() [<a href='function.move-uploaded-file'>function.move-uploaded-file</a>]: Unable to move '/tmp/phpUKo4ss' to '/myProject/public/media/images/22.jpg' in <b>/home/domain/myDomain/myProject/application/controllers/Controller.php</b> on line <b>178</b><br />
bij je upload moet je ook werken met $doelDirectory = APPLICATION_PATH . '/../public/media/images/';
kijk ook eens of je wel schrijfrechten hebt op die map