2010-10-26 30 views
0

J'ai plusieurs images dans un répertoire situé en dehors de la partie publique du serveur (en dehors du répertoire public_html). Je veux être capable de lire le contenu de l'image avec un fichier php, puis afficher le résultat en HTML.Affichage d'une image en php à partir d'un fichier dans un répertoire

Par exemple, je dispose d'un fichier php appelé getimg.php avec le code source suivant:

header('Content-type: image/jpeg'); 

$dir = '/home/server/images/'; 
$file_name = addslashes($_GET['file']); 

readfile('' . $dir . '' . $file_name . '.jpg'); 

getimg.php lit le contenu d'une image jpg dans le répertoire des images, puis référencé à l'aide de ce qui suit le code quand je veux afficher l'image à un utilisateur:

<img src="getimg.php?file=name_of_image_file"> 

le fichier getimg.php fait aussi des contrôles de vérification pour veiller à ce que l'utilisateur est connecté, possède effectivement l'image qu'ils essaient de voir, etc (ceci n'est pas montré ci-dessus pour des raisons de simplicité). Cette approche est destinée à contrôler l'accès aux fichiers image. Cependant, ce n'est pas la question à traiter.

Voici le problème: L'approche/code ci-dessus ne fonctionne que dans le navigateur Chrome. Les images ne s'affichent pas correctement dans IE, FF, Safari ou Opera. Des idées pour lesquelles cela ne fonctionne pas ou comment le faire correctement?

Notes:

  • J'essaie d'éviter d'utiliser MySQL pour stocker les images en raison de la grande quantité d'images. Être capable d'utiliser le système de fichiers est grandement préférable ici.

  • La solution doit être cross-browser friendly.

  • En réalité, l'image peut être un fichier jpg, png ou un fichier gif. Par souci de simplicité, le code ci-dessus gère les images jpg. Je doute que ce soit pertinent, mais Je suis PAS utiliser jQuery. Et non, je ne vais pas modifier mon site entier pour utiliser jQuery. Tous les messages "utiliser jQuery" recevront automatiquement une réponse négative. Je ne déteste pas jquery .. ce n'est juste pas la bonne solution pour mon site.

MISE À JOUR

Le problème n'a pas été avec le code lui-même. J'avais mon fichier php.ini défini pour inclure automatiquement un script de vérification de connexion. Comme je n'étais pas connecté à tous mes navigateurs, l'image ne s'affichait pas. Erreur idiote, mais compréhensible et fixe. Le code ci-dessus devrait fonctionner correctement. Il a également été mis à jour pour utiliser readfile() au lieu de file_get_contents(). Je vais laisser ce post pour tous ceux qui naviguent sur le web à la recherche d'un moyen de contrôler qui a accès à une image en utilisant php.

+0

Comment est exactement l'image "affiche pas correctement" dans IE/FF? Exactement ce qui se passe? Nous ne pouvons pas vous aider si vous ne nous dites pas ce qui se passe. – kijin

+1

'addslashes()' n'appartient pas ici. Il pourrait gâcher le nom de fichier, ce qui pourrait contribuer à vos problèmes. Vous devriez utiliser 'basename()' et peut-être quelques fonctions ctype pour désinfecter les noms de fichiers. De plus, 'file_get_contents()' peut vous faire manquer de mémoire si le fichier est gros. Déposez l'écho et utilisez 'readfile()' à la place. – kijin

+0

Désolé à ce sujet, j'ai mal assumé la clarté sur cette partie. Dans la partie , la sortie apparaît comme si j'avais entré la mauvaise URL. En d'autres termes, c'est comme si je mettais le src dans un fichier jpg qui n'existe pas et qui apparaît comme une image cassée. – user396404

Répondre

1

try this ..

if($fileExt == 'jpg'){ 
$im = imagecreatefromjpeg($filePath); 
    if ($im !== false) { 
     header('Content-Type: image/jpeg'); 
     imagejpeg($im); 
    } 
} 
if($fileExt == 'png'){ 
$im = imagecreatefrompng($filePath); 
    if ($im !== false) { 
     header('Content-Type: image/png'); 
     imagepng($im); 
    } 
} 

si l'image est gif, il y a aussi imagecreatefromgif()

0

Je l'ai utilisé l'approche que vous avez décrit précédemment et il fonctionne.Le fait que cela fonctionne dans Chrome suggère que c'est un problème de navigateur. Trois suggestions:

  1. Utilisez l'extension Firefox en direct ou en-têtes curl -I pour voir exactement ce que les en-têtes PHP envoie quand getimg.php est demandée. Il pourrait y avoir un problème de Content-Encoding ou de compression de gzip. Vous pouvez également envoyer des en-têtes tels que le navigateur met en cache l'image - par défaut, PHP enverra des en-têtes pour empêcher cela. Utilisez une RewriteRule pour utiliser src = "nom_fichier.jpg", c'est-à-dire utiliser une RewriteRule pour utiliser src = "nom_fichier.jpg".

    RewriteRule^(. +). Jpg de getimage.php $? File = $ 1.jpg

  2. Utilisez jQuery. jQuery fonctionne toujours.

+1

haha ​​.. # 3 a été utilisé assez bien que je ne peux pas le voter. – user396404