Télécharger un fichier de manière forcée en PHP
Dans ce tutoriel, nous apprenons à forcer le téléchargement de fichiers en PHP.
Forcer un téléchargement de fichier en PHP
Ce processus nécessite deux étapes :
- Créez le fichier PHP pour gérer ce fichier que vous souhaitez protéger.
- Ajoutez une pertinence à ce fichier PHP à l’intérieur du code HTML de la page au cours de laquelle il apparaît.
Après avoir téléchargé un fichier sur le serveur, créez un document PHP dans un éditeur de texte. Par exemple, si vous souhaitez forcer le téléchargement de sample.pdf au lieu de le visualiser en ligne, créez un script comme celui-ci.
<?php
header("Content-disposition: attachment; filename=sample.pdf");
header("Content-type: application/pdf");
readfile("sample.pdf");
?>
La référence au type de contenu en PHP est importante : c’est le type MIME du fichier que vous protégez. Par exemple, si vous avez plutôt enregistré un fichier MP3, vous devrez remplacer l’application/pdf par un MPEG audio.
Télécharger des fichiers avec PHP
Généralement, vous n’avez pas besoin d’utiliser un langage de script côté serveur comme PHP pour télécharger des images, des fichiers zip, des documents PDF, des fichiers exe, etc. Si ce type de fichier est stocké dans un dossier public accessible, vous pouvez simplement créer un lien hypertexte pointant vers ce fichier, et chaque fois qu’un utilisateur clique sur le lien, le navigateur télécharge automatiquement ce fichier.
<a href="downloads/test.zip">Download Zip file</a>
<a href="downloads/masters.pdf">Download PDF file</a>
<a href="downloads/sample.jpg">Download Image file</a>
<a href="downloads/setup.exe">Download EXE file</a>
La fonction readfile()
Vous pouvez forcer le téléchargement d’images ou d’autres types de fichiers directement sur le disque dur de l’utilisateur en utilisant la fonction PHP readfile()
. Ici, nous créons une simple galerie d’images qui permettra aux utilisateurs de télécharger les fichiers image à partir du navigateur d’un simple clic de souris. Créons un fichier appelé “image-gallery.php” et insérons-y le code suivant.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Simple Image Gallery</title>
<style type="text/css">
.img-box{
display: inline-block;
text-align: center;
margin: 0 15px;
}
</style>
</head>
<body>
<?php
// Array containing sample image file names
$images = array("hello.jpg", "resampled1.jpg");
// Loop through array to create image gallery
foreach($images as $image){
echo '<div class="img-box">';
echo '<img src="/examples/images/' . $image . '" width="200" alt="' . pathinfo($image, PATHINFO_FILENAME) .'">';
echo '<p><a href="/examples/php/download.php?file=' . urlencode($image) . '">Download</a></p>';
echo '</div>';
}
?>
</body>
</html>
Si vous regardez attentivement l’exemple de programme ci-dessus, vous pouvez trouver le lien de téléchargement qui mène à un fichier ; l’URL inclut également le nom du fichier image en tant que chaîne de requête. Nous avons également utilisé la fonction urlencode()
de PHP pour encoder les noms de fichiers d’images afin qu’ils puissent être transmis en toute sécurité en tant que paramètres d’URL, car les noms de fichiers peuvent contenir des caractères d’URL dangereux.
Voici le code complet du fichier "download.php"
qui force le téléchargement de l’image.
<?php
if(!empty($_GET['file'])){
$fileName = basename($_GET['file']);
$filePath = 'files.txt/'.$fileName;
if(!empty($fileName) && file_exists($filePath)){
// Define headers
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$fileName");
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
// Read the file
readfile($filePath);
exit;
}else{
echo 'The file does not exist.';
}
}
} else {
die("Invalid file name!");
}
}
?>
De même, vous pouvez forcer le téléchargement d’autres formats de fichiers tels que Word Doc, les fichiers PDF, etc. L’expression régulière de l’exemple ci-dessus n’autorise tout simplement pas les fichiers dont le nom commence ou se termine par un point (.
). Par exemple, il autorise des noms de fichiers comme hello.jpeg
ou resampled1.jpeg
, myscript.min.js
, mais n’autorise pas hello.jpeg.
ou .resampled.Jpeg.
.