Duplicate possible:
forcing a file download with php
force download of different filesObliger téléchargement depuis le serveur en php
J'essaie de permettre aux utilisateurs de télécharger des images de mon site en php. J'ai vu un tas d'articles à ce sujet, et j'essayais d'utiliser readfile des documents php. Mais je n'arrive pas à le faire fonctionner.
C'est le code pour le bouton que je suis en train de mettre en place pour lancer le téléchargement:
<!-- download image button -->
<form class="grid_12" style="text-align: center;" action="../includes/download.php" method="post">
<input type="hidden" name="id" value="<?php echo $photo->id; ?>" />
<input type="hidden" name="img" value="<?php echo $photo->filename; ?>" />
<?php if(isset($_GET['cat'])){?>
<input type="hidden" name="cat" value="<?php echo $_GET['cat']; ?>" />
<?php } ?>
<div id="download"><input type="submit" name="submit" value="Download Photo" /></div>
</form>
Et c'est le code que je l'ai mis dans mon fichier download.php (redirect_to est juste fonction qui appelle en-tête. (Lieu: var) où le var est ce que vous passez
<?php
require_once('initialize.php');
?>
<?php
header("Content-type: application/force-download; filename=".$_POST['img']);
// Force download of image file specified in URL query string and which
// is in the same directory as this script:
if(!empty($_POST['img']))
{
$file = $_POST['img'];
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');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
$addy = "../public/photo.php?id=".$_POST['id'];
if(isset($_POST['cat'])){
$addy .= "&cat=".$_POST['cat'];
}
redirect_to($addy);
}
header("HTTP/1.0 404 Not Found");
?>
les variables cachées que je vous envoie dans le poste sont la plupart du temps pour la redirection de reprendre l'utilisateur à la page ils téléchargés à partir après le téléchargement commence Sur mon hôte local, je suis redirigé vers la page I cli cked le bouton de téléchargement sur. Sur mon serveur, je suis juste envoyé à une page blanche en s'enregistrant comme download.php. Je pense que cela a quelque chose à voir avec la mise en mémoire tampon de sortie potentiellement, parce que je reçois une page blanche. Ce qui signifie généralement qu'il y avait une sorte de sortie avant d'appeler la fonction header().
Si quelqu'un pouvait me donner un aperçu de ce que je fais mal ici, je l'apprécierais grandement, Merci d'avoir lu.
-Alan
faire ob_start(); en haut de votre fichier de téléchargement –
Votre script est probablement vulnérable à [path traversal] (https://www.owasp.org/index.php/Path_Traversal) qui permet de lire n'importe quel fichier sur votre serveur. – Gumbo
Vous définissez l'en-tête 'Content-Type:' deux fois, je ne suis pas sûr de ce que le RFC dit à ce sujet ... vous voulez probablement vérifier cela en premier. – hakre