Bloquer la fenêtre de téléchargement

apocal33 -  
avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
je voulais savoir si il été possible de bloquer la fenêtre de téléchargement?
je m'explique :
je veut laisser des fichier en téléchargement dans un fichier, et que les utilisateur puisse choisir tout et n'importe quelle fichier avec
<form action="cible_envoi.php" method="post" enctype="multipart/form-data">
<p>
Formulaire d'envoi de fichier :<br />
<input type="file" name="monfichier" /><br />
<input type="submit" value="Envoyer le fichier" />
</p>
</form>
et le problème c'est que les gens on accès a tout les autre fichier.
Dons est ce que sa serait possible de donner l'accès a seulement 1 dossier.
merci d'avance

1 réponse

  1. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    Salut.

    Voilà deux solutions :

    - Tu peux créer un dossier pour chaque utilisateur et le protéger avec une identifcation HTTP (.htaccess et .htpasswd) où chaque utilisateur a son compte (et il n'y a qu'un compte par dossier).

    - Tu peux interdire l'accès au dossier par HTTP (avec un .htaccess contenant « Deny from all ») et créer un script de téléchargement en PHP qui se charge de vérifier si l'utilisateur est bien le propriétaire (il te faudra une base de données).
    0
    1. apocal33
       
      merci pour ta réponse avion-f16 !
      je veut bien le détaille pour la solution 2 ^^ si c possible
      merci
      0
    2. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
       
      Lors de l'envoie du fichier, afin d'éviter les doublons, renommes le fichier en un nom généré aléatoirement :
      $nom = uniqid(md5($_SERVER['REQUEST_TIME'])).$extension;

      Stocke les fichiers dans le dossier "fichiers".
      Dans ce dossier, crées un .htaccess contenant ceci :
      Deny from all

      Crées un fichier "telecharger.php" contenant ceci (minimum) :
      <?php
      session_start();
      define('DB_HOST','localhost');
      define('DB_USER','root');
      define('DB_PASS','');
      define('DB_NAME','nom_de_la_base');
      define('DB_DRIVER','mysql');
      
      if(isset($_SESSION['member_id'])) {
      	$pdo = new PDO(DB_DRIVER.':host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
      	$sql = 'SELECT COUNT(*) AS nb FROM fichiers WHERE user_id = '.(int) $_SESSION['id'].' AND id = '.$pdo->quote($_GET['file']);
      	$req = $pdo->query($sql);
      	$data = $req->fetch();
      
      	if($data['nb'] > 0) {
      		header('Content-Description: File Transfer');
      		header('Content-Type: application/octet-stream');
      		header('Content-Disposition: attachment; filename='.basename($_GET['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($_GET['file']));
      		ob_clean();
      		flush();
      		readfile($file);
      		exit;
      	} else {
      		header('HTTP/1.1 403 Forbidden');
      		echo 'Vous n\'êtes pas autorisé à obtenir ce fichier';
      	}
      } else {
      	header('HTTP/1.1 403 Forbidden');
      	echo 'Vous n\'êtes pas autorisé à obtenir ce fichier';
      }
      ?>
      Voilà la structure minimum de la table "fichiers" :
      - id : Nom de fichier généré
      - user_id : Identifiant unique du membre
      Tu peux ajouter d'autres données comme la date d'ajout, le type de fichier, l'id de la catégorie, ...

      Lorsque tu enregistres un fichier, n'oublie pas d'insérer l'entrée :
      INSERT INTO fichiers(id, user_id) VALUES($nom, $_SESSION['id'])


      Sans oublier le lien :
      <a href="telecharger.php?file=<?php echo $nom; ?>">Télécharger le fichier</a>
      0