IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Créer une Url pour un fichier


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 117
    Par défaut Créer une Url pour un fichier
    Bonjour, je m'interroge sur la façon de "dissimuler" un fichier téléchargeable et de lui attribuer une URL afin de pouvoir le télécharger.

    Comme le fait par exemple le site dropbox (hébergeur de fichier personnel).
    Si une personne peut m'éclairer sur le sujet se serrait simpa =)

    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Webmaster
    Inscrit en
    Octobre 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2009
    Messages : 17
    Par défaut
    Bonjour, je n'ai jamais utilisé dropbox mais pour moi la solution consisterait à générer une url unique à chaque utilisateur en utilisant l'url rewriting.

    dans le .htaccess :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    RewriteEngine on
    RewriteRule ^(.*)$ index.php?$1 [L,QSA]
    Chaque page non existante est redirigée vers index.php

    et ensuite on vérifie si l'url est associée à un fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
    $uri = $_SERVER['REQUEST_URI'];
    if ($uri === '/download/'.md5($nom_fichier.$_SESSION['uniqid']) {
      // lance le téléchargement
    }
    elseif (strpos($uri,'/download/') === false) {
      // message d'erreur : uri non associée
    }
    else {
      // chargement d'une autre page
    }
    ?>
    C'est un exemple très simplifié mais qui devrait donner une piste possible. C'est la solution que j'utilise pour la réinitialisation des mots de passe de mes utilisateurs : génération d'une uri unique et temporaire envoyée par email, puis lorsque le lien est cliqué dans le mail, vérification de la validité de cette uri (stockée dans une table et associée à l'id du fichier à téléchargé par exemple). Si c'est bon, alors on retourne le fichier avec le bon type mime.

    En espérant avoir été assez clair dans mes explications et ne pas répondre à côté de la plaque.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 117
    Par défaut
    Bonjour, merci pour ta réponse. Si j'ai bien compris :
    - Je place les documents dans un dossier protégé par un .htaccess
    - Un client souhaite rendre accéssible un de ces fichiers public, un id est généré et enregistré dans une bdd avec le lien exacte du fichier.
    - Quand on appel la page avec l'id, un scripte vérifie l'id et commence un transfert de fichier suivant l'id.

    le .htaccess lui s'occupe de "dissimuler" le chemin complet du fichier en générant une url unique.
    Donc il faut dans ma condition (if autorisé) je lance le fichier en téléchargement via php.
    Mais comment ?

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    on appelle cela pousser le telechargement par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        $nomDuFichierCache = 'monPdf.pdf';
        $fichier = trim( $_SERVER['DOCUMENT_ROOT'].'/ucqspdsddfn43loijgsszz/'.$nomFichier.'.pdf') ;
     
    if ( file_exists($fichier)){
        ini_set("memory_limit","50M");
        header("Content-Type: application/force-download");
        header("Content-Disposition: attachment; filename=".rawurlencode($nomDuFichierCache);
        readfile($fichier);
    }
    else{
     
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 117
    Par défaut
    Merci, avec toutes ces infos je vais pouvoir me débrouiller.

  6. #6
    Membre averti
    Profil pro
    Webmaster
    Inscrit en
    Octobre 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2009
    Messages : 17
    Par défaut
    Je vais essayer d'être un peu plus clair et sans url rewriting :

    - tu as ton dossier racine et un sous-répertoire nommé ./download/ dans lequel tu places un .htaccess

    - dans ton htacess tu donnes des règles pour interdire l'accès à ton dossier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    order deny, allow
    deny from all
    Quand un utilisateur upload un fichier, tu le copies dans download avec un id unique.

    Maintenant on met en place un schéma de base de donnée avec 3 tables : utilisateurs, fichiers et utilisateurs_fichiers (many to many).

    utilisateurs = id / login / etc.
    fichiers = id / titre / desc / etc.
    utilisateurs_fichiers = token / id_utilisateur / id_fichier

    Quand un utilisateur souhaite activer un téléchargement, il charge une page où se trouve la description de ton fichier et un lien de téléchargement.
    Ce lien est créé de la forme /monsite.com/files/token où token est un hash md5 ou sha1 :

    show_download.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
     
    $token = sha1('_selprefix_'.uniqid().'_selsuffix_');
    $uri = '/monsite.com/files.php?token='.$token;
     
    /* @todo : sauvegarder dans la table `utilisateurs_fichiers`
     l'id de l'utilisateur qui vient de demander la page, l'id du fichier et le token
     que l'on vient de générer */
     
    echo '<a href="'.$uri.'">télécharger le fichier</a>';
    ?>
    Quand l'utilisateur cliquera sur le lien, il lancera en fait la page 'files.php'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //@todo effectuer les vérifications habituelles sur une requête $_GET
    // récupération de l'id du fichier
    $sql = "SELECT id_fichier FROM utilisateurs_fichiers WHERE token = {$_GET['token']} && id_utilisateur = {$_SESSION['id_user']} ";
    //...
     
    // suivre l'exemple donné par ascito en remplaçant le chemin du fichier par :
    $fichier = __DIR__.'/download/'.$id_fichier;
    De cette manière, le chemin de téléchargement vers tes fichiers est unique à chaque utilisateur et remis à jour à chaque fois que ton utilisateur charge la page qui permet le téléchargement. Aucune personne non connectée ne peut accéder au fichier et aucun membre ne peut déduire l'uri qui permet d'accéder au fichier pour un autre utilisateur.

    À aucun moment tes utilisateurs n'ont accès directement à l'id de ton fichier.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/11/2014, 15h31
  2. Réponses: 3
    Dernier message: 23/07/2009, 11h44
  3. [XL-2003] Créer une macro pour plusieurs fichiers excel
    Par bocki dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/06/2009, 22h53
  4. Réponses: 3
    Dernier message: 21/03/2006, 13h12
  5. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo