file_exists ne fontionne pas..

Petit nouveau ! | 8 Messages

03 sept. 2010, 12:12

Bonjour ! (et merci de prendre le temps d'essayer de m'aider..)
Je viens de m'inscrire parce que j'ai réellement besoin d'aide ! Normalement, en cherchant, ou en le contournant, je trouve toujours solution à mon problème..
Sauf que cette fois-ci non !
J'ai installé sur mon PC (Windows) Apache, PHP, MySQL et phpMyAdmin, pour m'amuser un peu. L'idée de départ c'était de pouvoir partager en ligne quelques fichiers avec ma famille simplement.. Et petit à petit, pour m'occuper je m'amuse à améliorer l'interface..
Hier, en voulant rajouter de beaux icônes devant chaque nom de fichier, j'ai été emmener à utiliser le fonction file_exists(). Elle me retournait systématiquement false, même en mettant un adresse invariable genre "http://...". J'ai réussi à contourner le problème en faisant : $tmp = file(mon_fichier) puis if ($tmp[0]) ... Je ne sais pas pour quelle raison celle là il en veut bien et pas l'autre mais bon..
Ce matin, j'ai voulu afficher des thumbnails de mes photos.. J'utilise donc un fichier preview.php comme ceci :
<?php
header("Content-Type: image/jpeg");
if (!file_exists($preview)) {
	$preview="images/noimg.jpg";
}
$img_in = imagecreatefromjpeg($preview);
$img_out = imagecreatetruecolor($w, $h);
imagecopyresampled($img_out, $img_in, 0, 0, 0, 0, imagesx($img_out), imagesy($img_out), imagesx($img_in), imagesy($img_in));
$t = imagejpeg($img_out);
echo $t;
?>
J'ai cru au départ que peut être, la librairie GD n'était pas active mais si.. J'ai cru ensuite que ça pouvait peut être venir du register_globals, puisque j'appelle mon image en faisant :
<img src="preview.php?preview=http://..&w=..&h=.." />
J'ai donc remplacer tous les $preview $w et $h par des $_GET[preview] etc.. mais rien ne change.. En m'énervant ensuite un peu, j'ai supprimer les lignes :
header("Content-Type: image/jpeg");
if (!file_exists($preview)) {
	$preview="images/noimg.jpg";
}
Et j'ai remplacer la ligne : $img_in = imagecreatefromjpeg($preview); par : $img_in = imagecreatefromjpeg($_GET[preview]) or die ("erreur");
NB: j'ai viré le content-type pour voir ce qu'il se passait vraiment là dedans ! et j'ai tapé directement dans mon navigateur : http://.../preview.php?preview=http://..&w=..&h=..

Et là.. Erreur ! Sans parler que même avant, avec le file_exist, je retournais une nouvelle fois "false" ! Bref, le même script fonctionne chez OVH.. et sur mon server local non.. Avez-vous une idée ?

Mammouth du PHP | 672 Messages

03 sept. 2010, 12:35

Bonjour.

1. $preview a quelle valeur ?

2. Tu as lu le manuel ?
Cette fonction retourne FALSE pour les fichiers non accessibles en raison des restrictions du safe mode. Cependant, ces fichiers peuvent toujours être inclus s'ils sont dans le dossier safe_mode_include_dir.
Depuis PHP 5.0.0, cette fonction peut aussi être utilisée avec quelques protocoles url.
En PHP 4, si $preview = http://www.monsite.ext/chemin/fichier ça ne fonctionne pas.

Eléphanteau du PHP | 13 Messages

03 sept. 2010, 13:19

Bonjour,

Pour ton serveur local sous windows, essaye de metre le chemin physique du fichier.

(exemple : c:/mon_dossier/mon_ficher.jpg) avec des / et non des \ qui peuvent te poser probleme avec des quotes.
http://www.ilbee.net/
Créateur de solution Internet

Petit nouveau ! | 8 Messages

03 sept. 2010, 14:22

Bonjour.

1. $preview a quelle valeur ?

2. Tu as lu le manuel ?
Cette fonction retourne FALSE pour les fichiers non accessibles en raison des restrictions du safe mode. Cependant, ces fichiers peuvent toujours être inclus s'ils sont dans le dossier safe_mode_include_dir.
Depuis PHP 5.0.0, cette fonction peut aussi être utilisée avec quelques protocoles url.
En PHP 4, si $preview = http://www.monsite.ext/chemin/fichier ça ne fonctionne pas.
Bonjour macgawel !
1. $preview est une image, sa valeur c'est une url, qui est valide puisque lorsque je la tape seule dans le navigateur, l'image apparait.
2. J'ai lu le manuel, mais j'ai pas compris l'histoire du safemode, d'autant qu'en y retournant voir là, je vois que c'est obsolète.. Je comprends pas.. Qu'est ce que je dois/peux faire ? file_exists() retourne false pour une histoire de sécurité ?

Ps: C'est PHP5
Bonjour,

Pour ton serveur local sous windows, essaye de metre le chemin physique du fichier.

(exemple : c:/mon_dossier/mon_ficher.jpg) avec des / et non des \ qui peuvent te poser probleme avec des quotes.
Bonjour ilbee !
J'y avais pensé, mais je n'avais pas osé le faire, en mettant le chemin physique du fichier, je confirme, le file_exists fonctionne ! Mais alors pourquoi en mettant l'url non ?

EDIT: Le chemin physique, resout même le problème du redimensionnement de l'image (qui ne fonctionnait pas en partie parce que par erreur j'avais tapé $_GET[$w] au lieu de $_GET[w].. Comment puis-je faire en sorte que ça fonctionne maintenant avec une url normale ? Est-ce l'histoire du safe mode ?
Modifié en dernier par euhkah le 03 sept. 2010, 14:36, modifié 2 fois.

Eléphant du PHP | 314 Messages

03 sept. 2010, 14:29

Salut,

pour récupérer la variable preview de l'URL, tu dois utiliser $_GET["preview"] !!
Cordialement,
Julien - http://laravel.fr/

Petit nouveau ! | 8 Messages

03 sept. 2010, 14:35

Salut,

pour récupérer la variable preview de l'URL, tu dois utiliser $_GET["preview"] !!
Bonjour AoSIX !
Je sais oui, c'est ce que je fais regarde :
<?php
header("Content-Type: image/jpeg");
if (file_exists($_GET[preview])) { $url = $_GET[preview]; }
else { $url = "http://.../images/none.png"; }
$img_in = imagecreatefromjpeg($url) or die ("erreur");
$img_out = imagecreatetruecolor($_GET[w], $_GET[h]);
imagecopyresampled($img_out, $img_in, 0, 0, 0, 0, imagesx($img_out), imagesy($img_out), imagesx($img_in), imagesy($img_in));
$t = imagejpeg($img_out);
echo $t;
?>
Ca fonctionne avec :
http://.../preview.php?preview=D:\...\www\admin\photos\...\IMAGE_001.jpg&w=100&h=100
Mais pas avec :
http://.../preview.php?preview=http://.../admin/photos/.../IMAGE_001.jpg&w=100&h=100
Qui pourtant sont censés être la même chose..

Petit nouveau ! | 8 Messages

03 sept. 2010, 15:15

Bon, j'ai trouvé, ça ne fonctionne pas en chemin absolu : http... mais ça fonctionne avec du relatif.. Ce que finalement j'avais fais au départ, mais je suppose qu'avec l'erreur idiote du $_GET j'ai cherché loin pour si peu..

Merci !

Eléphant du PHP | 314 Messages

03 sept. 2010, 15:19

Bon, j'ai trouvé, ça ne fonctionne pas en chemin absolu : http... mais ça fonctionne avec du relatif.. Ce que finalement j'avais fais au départ, mais je suppose qu'avec l'erreur idiote du $_GET j'ai cherché loin pour si peu..

Merci !
Ça pourrait t'aider : http://www.ao6-labs.eu/2010/08/savoir-s ... nt-existe/
Cordialement,
Julien - http://laravel.fr/

Mammouth du PHP | 672 Messages

03 sept. 2010, 15:25

Bon, j'ai trouvé, ça ne fonctionne pas en chemin absolu : http... mais ça fonctionne avec du relatif.. Ce que finalement j'avais fais au départ, mais je suppose qu'avec l'erreur idiote du $_GET j'ai cherché loin pour si peu..

Merci !
Parce que quand tu utilises l'URL absolue (http://...) php pense que c'est un fichier distant.
Du coup, pour peu qu'il y ait des bridages/sécurités, c'est refusé.
Alors qu'en utilisant un chemin relatif il voit ça comme un fichier local.

Accessoirement : il faut si possible préférer les chemins relatifs - ça évite les maintenances quand on change de nom de domaine...