2010-09-22 3 views
2

Je veux savoir comment implémenter la logique pour mon bouton de téléchargement en PHP. J'ai un fichier dans le serveur web et ai une page avec le bouton de téléchargement. Je veux commencer à télécharger un fichier lorsque l'utilisateur appuie sur le bouton de téléchargement. Comment implémenter? Mercicomment implémenter la logique pour mon bouton de téléchargement

+4

Il suffit d'utiliser un lien simple au lieu d'un bouton? – halfdan

+0

Le problème ici est que je ne veux pas montrer aux utilisateurs un chemin où le fichier dowloadable est. Si je vais utiliser l'utilisateur de lien peut voir l'URL du fichier, ce qui n'est pas acceptable –

+3

Vous tirez une ressource à partir d'un serveur Web. Cette ressource aura toujours une adresse et vous ne pouvez pas la cacher. – Welbog

Répondre

3

Voici comment vous démarrez un téléchargement sans laisser l'utilisateur voir le chemin réel du fichier. Faites votre point de lien vers download.php? File = filename, et assurez-vous que le fichier existe dans le dossier de téléchargement. Utilisez ensuite ce code pour vérifier si le fichier existe et laissez-le le télécharger. En option, vous pouvez mettre une vérification de connexion ou une autre vérification. En outre, vous pouvez également bloquer l'accès au dossier contenant les fichiers avec un fichier .htaccess. Si vous le souhaitez, placez le code suivant dans un fichier .htaccess dans le répertoire des fichiers.

order allow, deny 
deny from all 
+0

C'est assez dangereux. Que faire si je décide de demander le fichier '../../../ home/user/something'? 'file_exists' correspondra à la requête, en supposant que le fichier existe réellement, et' readfile' se fera un plaisir de lire le fichier '/ path/to/file /../../../ home/user/something'. Vous * pouvez * sécuriser ce genre de méthode, mais pourquoi prendre ce risque? – Welbog

+0

@Welbog: merci! J'ai complètement oublié ça .. J'ai changé le script pour qu'il ne permette que de télécharger un fichier .zip. Il pourrait être étendu bien sûr, de sorte qu'il permet plus d'extensions comme .pdf ou quelque chose. – Evert

+0

C'est un peu mieux, mais cela vous permet quand même de récupérer des fichiers zip d'autres répertoires. Il serait préférable de ne pas utiliser les identifiants fournis par l'utilisateur dans les chemins réels. – Welbog

1

Dans les deux sollutions fournis (ReadFile ou en-tête X-Sendfile) le fichier peut être stocké en dehors le répertoire du serveur public (généralement appelé htdocs ou www).

//page.php 
<form method="get" action="download.php"> 
    With button <input type="submit" value="Download file" /> 
</form> 
or 
With link <a href="download.php">Download file</a> 


<?php // download.php 
$file = '/path/to/file.zip'; 

if (file_exists($file)) { 
    // send headers that indicate file download 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    // send file (must read comments): http://php.net/manual/en/function.readfile.php 
    readfile($file); 
    exit; 
} 

Une meilleure sollution, si votre serveur prend en charge l'en-tête X-Sendfile (mod_xsendfile) est:

<?php 
header('Content-Disposition: attachment;filename=hello.txt'); 
header('X-Sendfile: /path/to/file.zip'); 

http://codeutopia.net/blog/2009/03/06/sending-files-better-apache-mod_xsendfile-and-php/

Questions connexes