login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[ZF] file_exists (Opgelost)

Offline DriesA - 07/06/2011 21:07
Avatar van DriesALid Hoi,

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).

Hoe kan ik dit oplossen?

15 antwoorden

Gesponsorde links
Offline avdg - 07/06/2011 21:16
Avatar van avdg PHP gevorderde Heb je file_exists gebruikt met een volledige pad of een relatieve pad?
Bedankt door: DriesA
Offline Stijn - 07/06/2011 21:18
Avatar van Stijn PHP expert 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.
Bedankt door: DriesA
Offline DriesA - 08/06/2011 12:12 (laatste wijziging 15/08/2011 13:48)
Avatar van DriesA Lid Hoi,

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.

Niemand????
Offline MiST - 15/08/2011 16:39 (laatste wijziging 15/08/2011 16:40)
Avatar van MiST Lid 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.
Bedankt door: DriesA
Offline DriesA - 15/08/2011 21:55 (laatste wijziging 16/08/2011 08:39)
Avatar van DriesA Lid Hoi MiST,

Bedankt voor je antwoord. Ik heb zowel relatieve als absolute paden geprobeerd.
Momenteel zet ik de file als volgt:

  1. $tmp = 'http://'.$_SERVER['SERVER_NAME'].$this->url.'/media/images/'.$this->id.'.jpg'


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...
Offline MiST - 16/08/2011 12:11
Avatar van MiST Lid 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).

file_exists($tmp) zal dus niet werken denk ik. 

doe liever:

  1. $file = 'media/images/' . $this->id . '.jpg';
  2. if(file_exists($file))
  3. {
  4. $link = $this->serverUrl() . $this->baseUrl() . $file;
  5. }


... 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 
Bedankt door: DriesA
Offline DriesA - 16/08/2011 12:58
Avatar van DriesA Lid Hoi MiST,

Bedankt voor de info. Maar helaas, als ik jouw manier probeer geeft hij ook false weer.

Heb nu het volgende:

  1. $full = $this->url.'/media/images/'.$this->id.'.jpg';
  2. $tmp = '/media/images/'.$this->id.'.jpg';
  3. if(file_exists($tmp))
  4. {
  5. echo '<img align="left" src="'.$full.'" HEIGHT="80" WIDTH="80">';
  6. }
  7. else{
  8. echo '<img align="left" src="'.$this->url.'/media/images/0.jpg" HEIGHT="80" WIDTH="80">';
  9. }


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.
Offline xSc - 16/08/2011 15:37
Avatar van xSc Onbekend Wat zijn jouw instellingen, dries? Heb je je virtualhost aangepast? Het lijkt serieus iets met je pad of met persmissions te zijn.
Bedankt door: DriesA
Offline MiST - 16/08/2011 15:50 (laatste wijziging 16/08/2011 15:52)
Avatar van MiST Lid $tmp MAG NIET met een '/' beginnen! als je met een '/' begint, wil dit zeggen dat het een absoluut pad is!

/media -> absoluut pad
media -> relatief pad

trailing slashes zijn niet zo belangrijk maar slashes vooraan maken een wereld van verschil!
Bedankt door: DriesA
Offline DriesA - 17/08/2011 09:06
Avatar van DriesA Lid Hoi MiST,

Met jouw tip ben ik er bijna vermoed ik.
Momenteel heb ik dan het volgende staan:

  1. $path = 'media/images/';
  2. $tmp = $path.$this->id .'.jpg';
  3. //$path = $this->url . $path;
  4. //$tmp = $path.$this->id .'.jpg';
  5. if(file_exists($tmp))
  6. {
  7. echo '<img align="left" src="'.$tmp.'" HEIGHT="80" WIDTH="80">';
  8. }
  9. else{
  10. echo '<img align="left" src="'.$path.'0.jpg" HEIGHT="80" WIDTH="80">';
  11. }
  12. echo '<img align="right" src="'.$path.'Logo.jpg" HEIGHT="80" WIDTH="80">';


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?

Alvast bedankt.
Dries
Offline MiST - 17/08/2011 13:18
Avatar van MiST Lid 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 door: DriesA
Offline lemoinet - 17/08/2011 17:10
Avatar van lemoinet PHP gevorderde je kan APPLICATION_PATH gebruiken om te checken of de afbeelding bestaat

normaal wordt APPLICATION_PATH in je index.php geset.

  1. defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(__DIR__ . '/application'));



  1. $tmp = APPLICATION_PATH . '/../public/media/images/' . $this->id . '.jpg';
  2. if(file_exists($tmp))
  3. {
  4. echo '<img align="left" src="' . $this->baseUrl('public/media/images/' . $this->id . '.jpg').'" HEIGHT="80" WIDTH="80">';
  5. }
  6. else{
  7. echo '<img align="left" src="'.$this->baseUrl('public/media/images/0.jpg').'" HEIGHT="80" WIDTH="80">';
  8. }


zoiets ongeveer
Bedankt door: DriesA
Offline DriesA - 17/08/2011 21:17 (laatste wijziging 17/08/2011 21:44)
Avatar van DriesA Lid Hoi lemoinet,

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.

Ik heb volgende code:
  1. if(isset($_FILES['foto']))
  2. {
  3. if(($_FILES['foto']['type'] == "image/jpeg" || $_FILES['foto']['type'] == "image/pjpeg" || $_FILES['foto']['type'] == "image/jpg") && $_FILES['foto']['size'] < 2097152)
  4. {
  5. //$doelDirectory = APPLICATION_PATH . '/../public/media/images/';
  6. $doelDirectory = $this->_request->getBaseUrl().'/media/images/';
  7. //$doelDirectory = 'http://'.$_SERVER['SERVER_NAME'].$this->url.'/media/images/';
  8. $doelFile = $doelDirectory.$id.'.jpg';
  9. $res = move_uploaded_file ($_FILES['foto']['tmp_name'], $doelFile);
  10. $this->view->msg .= $doelDirectory . $res;
  11. }
  12. else
  13. {
  14. $this->view->msg .= 'Enkel jpg/jpeg fotos kleiner dan 2Mb zijn toegelaten.';
  15. $error = 1;
  16. }
  17. }


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 />

Heeft dit ook iets met mijn path te maken?

Alvast bedankt.
Offline lemoinet - 18/08/2011 11:42
Avatar van lemoinet PHP gevorderde 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
Bedankt door: DriesA
Offline DriesA - 18/08/2011 14:03
Avatar van DriesA Lid Hoi allemaal,

Bedankt voor de hulp, alles werkt nu zoals het zou moeten 
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.267s