Envoyer un fichier (non HTML) proprement

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,
pour un module que je développe, j'ai besoin d'envoyer des fichiers de formats autres que HTML (exemple : image, pdf etc ...) et ces fichiers sont générés ou trouvé dynamiquement (ce ne sont pas des fichiers accessible directement par leur URL directe, ni des pièces jointes à des nodes).
J'ai donc une fonction de callback correspondant à une page définie dans le menu de mon module, cette fonction détermine quel fichier doit être envoyé et l'envoie.
En PHP, ça donne quelque chose du genre (version simplifiée) :

<?php
function monmodule_mafonctiondecallback() {
   
$cheminFichier = '/un/fichier/quelque/part.pdf';
   
header('Content-type: '.mime_content_type($cheminFichier));
    print(
file_get_contents($cheminFichier));
    exit();
}
?>

Le problème, vous l'aurez compris, c'est que ça n'est pas "propre" :

1) ma fonction est censée retourner une source html : or moi je ne retourne rien et j'arrête brutalement l'execution avec un exit(); afin que drupal ne rajoute pas du code HTML correspondantà des menus ou des blocs qui n'ont rien à faire dans un fichier PDF ou image ...

2) avec cette méthode, pas de cache : or sur mon serveur de production je souhaite que le contenu des fichiers envoyés (ainsi que l'entete content-type) soient mis en cache pour économiser de la ressource.

J'imagine qu'il doit y avoir un meilleur moyen, mais j'ignore lequel ...
Y'a-t-il une fonction spéciale, un hook, un module qui me donnerait l'API appropriée ... ?

Merci d'avance,

Hervé

Forum : 
Version de Drupal :