2010-01-08 7 views
14

Je veux servir un fichier existant dans le navigateur en PHP. J'ai vu des exemples sur image/jpeg mais cette fonction semble enregistrer un fichier sur disque et vous devez d'abord créer un objet image de bonne taille (ou je ne le comprends pas :) :)Fichier de sortie PHP sur le disque au navigateur

In asp. net je le fais en lisant le fichier dans un tableau d'octets puis j'appelle context.Response.BinaryWrite (bytearray), donc je cherche quelque chose de similaire en PHP.

Michel

Répondre

26

Il est fpassthru() qui devrait faire exactement ce dont vous avez besoin. Voir la saisie manuelle pour lire l'exemple suivant:

<?php 

// open the file in a binary mode 
$name = './img/ok.png'; 
$fp = fopen($name, 'rb'); 

// send the right headers 
header("Content-Type: image/png"); 
header("Content-Length: " . filesize($name)); 

// dump the picture and stop the script 
fpassthru($fp); 
exit; 

?> 

Voir here pour toutes les fonctions du système de fichiers de PHP.

S'il s'agit d'un fichier binaire que vous souhaitez proposer au téléchargement, vous souhaiterez probablement envoyer les en-têtes appropriés afin que la boîte de dialogue "Enregistrer sous ..." s'affiche. Voir la première réponse à this question pour un bon exemple sur ce que les en-têtes à envoyer.

+1

Que faire si j'ai déjà du contenu binaire stocké en tant que variable. Comment puis-je le sortir dans le navigateur en tant que fichier téléchargeable? – CMCDragonkai

2

Cela devrait vous aider à démarrer: http://de.php.net/manual/en/function.readfile.php

Edit: Si votre serveur Web prend en charge, en utilisant

header('X-Sendfile: ' . $filename); 

où le nom de fichier contient un chemin d'accès local comme

/var/www/www.example.org/downloads/example.zip 

est plus rapide que readfile().

(considérations de sécurité usuelles pour l'utilisation de la tête() appliquent)

+0

+1 pour 'X-Sendfile'. – Christian

1

Pour mon site Web et les sites Web que je crée pour les clients, j'utilise un script PHP que j'ai trouvé il y a longtemps.

Il se trouve ici: http://www.zubrag.com/scripts/download.php

J'utilise une version légèrement modifiée de celui-ci pour me permettre de masquer la structure du système de fichiers (ce qu'il fait par défaut), en plus de ne pas permettre la liaison à chaud (par défaut) et J'ai ajouté quelques fonctionnalités de suivi supplémentaires, telles que référent, IP (par défaut), et d'autres telles données que je pourrais avoir besoin si quelque chose se présente.

Espérons que cela aide.

+0

Merci pour le script. Si je veux développer mon premier script, je vais certainement l'utiliser. – Michel

2

-je utiliser readfile() (http://www.php.net/readfile) ...

Mais vous devez vous assurer que vous définissez le droit « Content-Type » avec en-tête() de sorte que le navigateur sait quoi faire avec le fichier.

Vous pouvez également forcer le navigateur à télécharger le fichier au lieu d'essayer d'utiliser un plug-in pour l'afficher (comme pour les fichiers PDF), j'ai toujours trouvé cela un peu "hacky", mais il est expliqué au lien ci-dessus.

9

J'utilise cette

if (file_exists($file)) { 


     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename='.basename($file)); 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($file)); 

     ob_clean(); 
     flush(); 
     readfile($file); 
     exit; 

    } 
Questions connexes