login  Naam:   Wachtwoord: 
Registreer je!
 Forum
Zoeken  Regels  Help
Categorieën > Object georiënteerd

[ZF] file_exists (Opgelost)

DriesA – 07/06/2011 21:07
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?


Pagina:

15 antwoorden

Gesponsorde links

avdg – 07/06/2011 21:16
Heb je file_exists gebruikt met een volledige pad of een relatieve pad?

Stijn – 07/06/2011 21:18
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.

DriesA – 08/06/2011 12:12 (Laatst gewijzigd op 15/08/2011 13:48)
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????

MiST – 15/08/2011 16:39 (Laatst gewijzigd op 15/08/2011 16:40)
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.

DriesA – 15/08/2011 21:55 (Laatst gewijzigd op 16/08/2011 08:39)
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...

MiST – 16/08/2011 12:11
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 

DriesA – 16/08/2011 12:58
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.

xSc – 16/08/2011 15:37
Wat zijn jouw instellingen, dries? Heb je je virtualhost aangepast? Het lijkt serieus iets met je pad of met persmissions te zijn.

MiST – 16/08/2011 15:50 (Laatst gewijzigd op 16/08/2011 15:52)
$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!

DriesA – 17/08/2011 09:06
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

Gesponsorde links


Pagina:

Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten:

© 2002-2012 Sitemasters.be - Regels - Gehost door: Vircon - Laadtijd: 0.136s