Servir de l'image avec un script PHP vs direct de chargement d'une image
Je veux surveiller la façon dont souvent quelques images externes sont chargés.
Donc, mon idée est plutôt de donner une uri directement comme ceci:
www.site.com/image1.jpg
Je peux créer un script PHP qui lit l'image, j'ai donc construit un fichier PHP et mon code HTML devrait ressembler à ceci:
<img src="www.site.com/serveImage.php?img=image1.jpg">
mais je ne sais pas comment lire l'image à partir du disque et de le retourner. Aurais-je retourner un tableau d'octets ou de définir le type de contenu?
Salutations,
Michel
Vous devez vous connecter pour publier un commentaire.
Vous devez définir le type de contenu:
Puis vous chargez l'image et à la sortie comme ceci:
L'envoi des images par le biais d'un script sympa pour d'autres choses comme le redimensionnement et la mise en cache à la demande.
Comme répondu par Pascal MARTIN la fonction
readfile
et ces en-têtes sont les exigences:header('Content-Type: image/gif');
mime_content_type
image/gif
image/jpeg
image/png
Mais à côté de l'évidence du type de contenu, vous devriez aussi regarder les autres en-têtes tels que:
header('Content-Length: 348');
taille
header('Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT');
filemtime
etdate
à formater dans la RFC 2822 formatheader('Last-Modified: '.date(DATE_RFC2822, filemtime($filename)));
header("HTTP/1.1 304 Not Modified");
Pour la dernière date de modification, chercher ce dans
$_SERVER
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
$_SERVER
avec la cléhttp_if_modified_since
Liste de l'en-tête HTTP réponses
Pour obtenir quelque chose comme cela, votre script devra :
Cela se fait avec la
header
fonction, avec un code comme ceci :Ou
ou autre, selon le type de l'image.
Pour envoyer les données de l'image, vous pouvez utiliser le
readfile
fonction :De cette façon, dans une fonction, vous lire le fichier, et la sortie de son contenu.
Au passage :
serveImage.php?file=/etc/passwd
devrait être OK, par exemple.J'utilise le "passthru" la fonction à appeler "chat" de commande, comme ceci:
Fonctionne sur Linux. Permet d'économiser des ressources.
Au lieu de modifier directement l'url de l'image dans le code HTML, vous pouvez mettre une ligne dans la configuration d'Apache ou
.htaccess
à réécrire toutes les demandes des images dans un répertoire à un script php. Alors dans ce script, vous pouvez utiliser les en-têtes de requête et de la$_server
tableau pour traiter la demande et de desservir le fichier.En premier dans votre .htaccess:
Le script
serve.php
doit être dans le même répertoire que.htaccess
. Vous aurez probablement écrire quelque chose comme ceci:(Ce script peut être amélioré!)
Vous êtes probablement mieux de l'examen de votre serveur de logs d'accès pour cela. L'exécution de toutes les images par le biais de php pourrait mettre un peu de charge sur votre serveur.
Aussi, si vous voulez à l'utilisateur de voir un vrai nom de fichier à la place de votre scriptname lorsque l'utilisateur du CMR sur l'image et sélectionner "Enregistrer sous", vous devez également définir cet en-tête:
Je sers mes images avec readfile ainsi, mais je suis allé le mile supplémentaire à la fois pour la sécurité et la fonctionnalité supplémentaire.
J'ai une base de données qui stocke l'id de l'image, de ses dimensions et de l'extension de fichier. Cela signifie également que les images doivent être téléchargées (qui permet en option de redimensionnement), j'ai donc utiliser le système uniquement pour le contenu et pas les images nécessaires pour le site lui-même (comme les origines ou les sprites).
Il a également fait un très bon travail de s'assurer que vous pouvez seulement demander des images.
Alors, pour servir le flux de travail simplifié serait comme ça (pas de post-production de code ici):
1) obtenir l'ID de l'image demandée
2) Rechercher dans la base de données
3) Lancer des en-têtes basés sur l'extension ("jpg" obtient réadressé à "jpeg" à télécharger)
4)
readfile("/images/$id.$extension");
5) Éventuellement, protéger /images/dir de sorte qu'il ne peut pas être indexé (pas un problème dans mon propre système de cartes URL comme /image/affichage/11 à quelque chose comme /index.le php?module=image&action=view&id=11)