php:télécharger un fichier

Nouveau WRInaute
bonjour à tous,
voici mon problème, j'essaye de donner l'accès au téléchargement d'un fichier dans un répertoire du serveur (/public_ftp), le problème est que l'accès à ce répertoire est interdit malgré j'ai donné le droit de lecture et d'exécution à tout le monde. par contre si je place le fichier dans le répertoire /public_html, le téléchargement est lancé.
j'utilise la fonction readfile pour cela, est ce que je dois passer par un téléchargement en utilisant les paramètres ftp ou c'est possible déjà avec cette fonction ?
voici le code que j'utilise :
//Fichier download.php : lien vers le fichier de téléchargement download_files.php
<a href="download_files.php?filename=MABIA-REGION Software.rar" title="Download MABIA-REGION"><img src="images/download.png"/></a>
//Fichier download_files.php
<?php
// désactive le temps max d'exécution
set_time_limit(0);
if (empty($_GET["filename"]))
{
header("HTTP/1.1 404 Not Found");
exit;
}
// le nom doit être un nom de fichier
if(basename($_GET["filename"]) != $_GET["filename"])
{
header("HTTP/1.1 400 Bad Request");
exit;
}
// vérifie l'existence et l'accès en lecture au fichier
$filename = $_SERVER['DOCUMENT_ROOT']."../public_ftp/".$_GET["filename"];
if (!file_exists($filename))
{
header("HTTP/1.1 404 Not Found");
exit;
}
if (!is_file($filename) || !is_readable($filename))
{
header("HTTP/1.1 404 Not Found");
exit;
}
//telechargement
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($filename));
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($filename));
readfile($filename);
?>

merci pour votre aide
 
WRInaute impliqué
En résumé, si lorsque tu places ton fichier dans un autre repertoire ça fonctionne.
Tu peux donc te dire que le code fonctionne.

Tu dis avoir mis tous les droits, c'est sur le repertoire ou sur le fichier ?
Pour moi il te faut explorer la piste des proprietaires et groupes sur le fichier ou le repertoire.

Quand la fonction readfile se réalise, elle l'est pas le biais d'un groupe d'utilisateur et d'un utilisateur qui ne doit pas avoir les droits.
Creuse de ce côté là.
Tu peux ainsi utiliser les commandes au moins provisoirement :
chmod 777 sur ton repertoire et tes fichiers concernés
chown et chgrp pour mettre tes fichiers et tes repertoires a un proprietaire qui aurait les droits.

Souvent readfile travail en tant qu'utilisateur www-data et ce même groupe, mais c'est un exemple cela dépend des distributions
 
Discussions similaires
Haut