[PHP] file_exists geeft altijd false

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Yoki1985
  • Registratie: Augustus 2007
  • Laatst online: 19-09 08:07
Als ik file_exists() gebruik krijg ik altijd false terug. echter als ik naar de file zelf ga dan krijg ik de afbeelding wel te zien dus het bestand bestaat wel degelijk (http://www.yokisoft.be/data/product_afbeeldingen/thumb_3.jpg).

PHP:
1
file_exists("/data/product_afbeeldingen/thumb_3.jpg");


Ook maak ik gebruik van een .htacces file:

code:
1
2
3
4
5
6
7
8
RewriteEngine on
RewriteRule ^(.*)afbeeldingen(.*) - [L]
RewriteRule ^(.*)js(.*) - [L]
RewriteRule ^(.*)css(.*) - [L]
RewriteRule ^(.*)cms(.*) - [L]
RewriteRule ^(.*)data(.*) - [L]
RewriteRule ^(.*)includes(.*) - [L]
RewriteRule ^(.*)$ cms/basis/rewriteurl.php


Hierdoor kan ik dynamisch urls maken in de vorm van http://www.domein.be/map1/map2/product
Hierin heb ik de regel RewriteRule ^(.*)data(.*) - [L] staan zodat als hij in de url de map data tegenkomt de urlredirecting links laat liggen en direct naar de file gaat. hierdoor kan ik afbeeldingen gewoon inladen zonder dat deze gaat redirecten.

Ik denk dat hij hierop vast loopt maar ik ben niet zeker en weet niet hoe ik dit moet controleren. Iemand enig idee?

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Met /data ga je naar de root van je *nix filesystem (vgl. c:\ onder Windows). Wil je met absolute paden werken, doe dan eens die(getcwd()) om te kijken welke map je moet hebben.

Acties:
  • 0 Henk 'm!

  • kunnen
  • Registratie: Februari 2004
  • Niet online
Vervang idd de /data door ./data of door data en het werkt wel.

Acties:
  • 0 Henk 'm!

  • Yoki1985
  • Registratie: Augustus 2007
  • Laatst online: 19-09 08:07
Ik heb dit gedaan maar krijg nog altijd geen afbeelding te zien. zie maar naar http://www.yokisoft.be/moederborden .
De foto van het eerste product op deze pagina heeft een foto want als ik de link manueel in voer (http://www.yokisoft.be/data/product_afbeeldingen/thumb_9.jpg) krijg ik de afbeelding te zien, echter de functie file_exists geeft toch false terug.

Acties:
  • 0 Henk 'm!

Verwijderd

file_get_contents(/data/product_afbeeldingen/thumb_19.jpg) ... failed to open stream:
Je hebt niets veranderd dus.

Acties:
  • 0 Henk 'm!

  • Stamgastje
  • Registratie: April 2003
  • Laatst online: 02-02-2020
Ter verduidelijking: je probeert dus een (absolute) URL te gebruiken. Echter, bij de aanroep van deze functie moet je geen URL maar een lokale bestandsnaam meegeven. Deze kan absoluut zijn of anders relatief t.o.v. de huidige directory (op te vragen met getcwd()).

Voorbeeld: stel dat "/var/www" de root van je web server is en je de file "/var/www/mydir/myfile" wilt benaderen. Als URL zou dat idd "/mydir/myfile" zijn. In dit geval moet je echter "/var/www/mydir/myfile" meegeven aan de functie file_exists(). Of evt. "mydir/myfile" als "/var/www/" de huidige werkdirectory is.

[ Voor 37% gewijzigd door Stamgastje op 13-07-2008 22:18 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
PHP:
1
file_exists($_SERVER["DOCUMENT_ROOT"]."/data/product_afbeeldingen/thumb_3.jpg");

Zie de documentatie. Werkt trouwens niet altijd goed, oa met IIS niet altijd.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
met print_r($_SERVER); het pad opzoeken van je document root, die even ergens in een configje zetten als define en lekker daarmee werken, werkt perfect en is ook meer portable als je eens wisselt van config (windows hosting is vaak een ramp imo).

Acties:
  • 0 Henk 'm!

  • Yoki1985
  • Registratie: Augustus 2007
  • Laatst online: 19-09 08:07
Het is me gelukt. bedankt voor de informatie.

Enkel de eerste / weg laten werkte niet voor mij. ik moest er dmv getcwd() het volledige path bijzetten.

Thx

Acties:
  • 0 Henk 'm!

Verwijderd

Cartman! schreef op zondag 13 juli 2008 @ 23:02:
met print_r($_SERVER); het pad opzoeken van je document root, die even ergens in een configje zetten als define en lekker daarmee werken, werkt perfect en is ook meer portable als je eens wisselt van config (windows hosting is vaak een ramp imo).
Je kunt beter iets gebruiken als:
PHP:
1
define ( 'MY_BASEDIR', dirname ( __FILE__ ) . DIRECTORY_SEPARATOR );

Dat in je belangrijkste include zetten scheelt je een hoop ellende. :)
[edit]
Wacht even, voor de dingen die geserveerd moeten worden is je document root inderdaad de juiste keuze als die bestanden zich niet per se binnen de applicatie directory staan ;)

[ Voor 14% gewijzigd door Verwijderd op 14-07-2008 11:43 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Of ervoor zorgen dat je alles opent via je index in je root. Dan weet je dat je cursieve paden altijd goed zitten.

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Die defines zijn overbodig en fout gevoelig, je kunt de paden immers ook gewoon aan je include path toevoegen.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
PrisonerOfPain schreef op maandag 14 juli 2008 @ 11:50:
Die defines zijn overbodig en fout gevoelig, je kunt de paden immers ook gewoon aan je include path toevoegen.
Dat is denk persoonlijk. Als ik de locatie naar een file-upload wil opgeven pak ik liever een define dan dat ik die map toevoeg aan mn include_path. Overigens moet je voor je include_path nog steeds eenmalig die locatie opgeven, dus het is net zo foutgevoelig (1 woord) als de define.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
PrisonerOfPain schreef op maandag 14 juli 2008 @ 11:50:
Die defines zijn overbodig en fout gevoelig, je kunt de paden immers ook gewoon aan je include path toevoegen.
Jouw manier is juist foutgevoelig en redundant. :>
Jij moet bij elke include met het handje het begin van het pad goed zetten, wat in feite een magische string in je code is, terwijl dat in een constante kan. Ik weet in ieder geval welke manier minder foutgevoelig is en waarbij scripts makkelijker te verhuizen zijn. :)

edit:
Doh, je had over die setting. Maar dan nog vind ik het gebruiken van een constante veel duidelijker.

[ Voor 9% gewijzigd door Voutloos op 14-07-2008 15:42 ]

{signature}


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Cartman! schreef op maandag 14 juli 2008 @ 15:31:
[...]

Dat is denk persoonlijk. Als ik de locatie naar een file-upload wil opgeven pak ik liever een define dan dat ik die map toevoeg aan mn include_path. Overigens moet je voor je include_path nog steeds eenmalig die locatie opgeven, dus het is net zo foutgevoelig (1 woord) als de define.
Ik doelde er op dat de define bij iedere include, fopen et cetera gebruikt dient te worden terwijl dat niet het geval is als je het pad toevoegt aan je include_path. Het gaat er dus niet zo zeer om dat je eenmalig de locatie op moet geven; eerder dat je vervolgens jezelf constant aan het herhalen bent omdat je MY_BASEDIR overal moet gebruiken. Natuurlijk zijn er uitzonderingen te bedenken waarbij het niet verstandig is om dit te doen maar over het algemeen is de include_path setting hier gewoon voor gemaakt.
Voutloos schreef op maandag 14 juli 2008 @ 15:39:
[...]
Jouw manier is juist foutgevoelig en redundant. :>
Jij moet bij elke include met het handje het begin van het pad goed zetten, wat in feite een magische string in je code is, terwijl dat in een constante kan. Ik weet in ieder geval welke manier minder foutgevoelig is en waarbij scripts makkelijker te verhuizen zijn. :)
Pàrdon? Wat ik trachtte te zeggen was dat je éénmalig je include_path goed zet in plaats van dat je overal je define moet neerzetten constante moet gebruiken. Kortom het verschil tussen:

PHP:
1
2
3
4
define('MY_BASEDIR', 'foo/bar/etc');

fopen(MY_BASEDIR . '/text.txt', 'r');
include MY_BASEDIR . 'bliep.php'


En

PHP:
1
2
3
4
set_include_path(get_include_path() . PATH_SEPARATOR . 'foo/bar/etc');

fopen('text.txt', 'r');
include 'bliep.php'

[ Voor 32% gewijzigd door PrisonerOfPain op 14-07-2008 15:46 ]


Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

pedorus schreef op zondag 13 juli 2008 @ 22:26:
PHP:
1
file_exists($_SERVER["DOCUMENT_ROOT"]."/data/product_afbeeldingen/thumb_3.jpg");

Zie de documentatie. Werkt trouwens niet altijd goed, oa met IIS niet altijd.
Het werkt helemaal niet goed, wat overigens ook in de documentatie staat. file_exists() werkt alleen met lokale bestanden.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
igmar schreef op maandag 14 juli 2008 @ 22:40:
[...]


Het werkt helemaal niet goed, wat overigens ook in de documentatie staat. file_exists() werkt alleen met lokale bestanden.
$_SERVER['DOCUMENT_ROOT'] is een lokale map, wat is het probleem? :?
Pagina: 1