Masquer URL de téléchargement

Eléphanteau du PHP | 21 Messages

14 oct. 2012, 16:55

Bonjour à tous!

J'ai créé un site d'hébergement de fichier simple ( pas plus de 10Mo ).
J'aimerais bien que pour télécharger les fichiers, les utilisateurs soient obligés de passer par mon site, par exemple avec download.php?file=<id du fichier>.

Or, quand on lance le téléchargement, j'ai remarqué que l'on voyait le chemin direct ( du style : monsite.com/files/<id du fichier>/fichier.zip ) <-- & donc un utilisateur pourrait distribuer ce lien au lieu de download.php?file=<id du fichier> !

Comment pourrais-je masquer cet URL, ou bien créer un chemin temporaire, ou... ?

Merci d'avance !

ViPHP
xTG
ViPHP | 7331 Messages

14 oct. 2012, 17:47

Une table de correspondance id / chemin ;)

Eléphanteau du PHP | 21 Messages

14 oct. 2012, 18:13

J'ai déjà une table avec l'ID du fichier, et mon script PHP récupère le $_GET['file'] cherche le fichier correspondant à cette valeur. Si elle existe, le script récupère le chemin du fichier, et l'affiche sur le style dans un <a>. Donc le problème n'est pas là ^^ C'est que lors du téléchargement, l'utilisateur va voir monsite.com/file/fichier.zip <-- donc il peut partager ce lien au lieu de file.php?file=fzpofjzfpzj par exemple.

ViPHP
ViPHP | 2577 Messages

14 oct. 2012, 18:23

Tu peux utiliser une variable de session pour indiquer que la page proposant le téléchargement a bien été affichée. Le téléchargement peut se faire via une script php avec la fonction readfile().

Eléphanteau du PHP | 21 Messages

14 oct. 2012, 18:37

Hum, peux-tu m'éclairer avec readfile() ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 oct. 2012, 12:52

regarde la doc de la fonction header il y a un exemple similaire à ce que tu veux faire.


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 21 Messages

15 oct. 2012, 13:01

J'ai un problème avec readfile() : les gros fichiers ne sont pas gérés :/

Eléphanteau du PHP | 21 Messages

15 oct. 2012, 13:17

j'ai réussi en faisant cela :
<?php
$token = $_GET['q'];
$unid = $_GET['f'];
if( strlen($token)<32 )
{
        die("Invalid token!");
}
include ('connectdb.php');
$bdd=connectdb();
$filedir=$bdd->query('SELECT file_dir,file_name FROM files WHERE unic_id="'.$unid.'"');
$filedir2=$filedir->fetch();
$filename=$filedir2['file_name'];
$filedir=$filedir2['file_dir'];
$filedir=str_replace("xxx","",$filedir);
/* Define the secret file: */
$secretfile = $filedir;

/* This variable is used to determine if the token is valid or not: */
$valid = 0;

/* Define what file holds the ids. */
$file = "tmp/urls.txt";

/* Read the whole token-file into the variable $lines: */
$lines = file($file);

/* Truncate the token-file, and open it for writing: */
if( !($fd = fopen("tmp/urls.txt","w")) )
        die("Could not open $file for writing!");

/* Aquire exclusive lock on $file. */
if( !(flock($fd,LOCK_EX)) )
        die("Could not equire exclusive lock on $file!");

/* Loop through all tokens in the token-file: */
for( $i=0; $lines[$i]; $i++ )
{
        /* Is the current token the same as the one defined in $token? */
        if( $token == rtrim($lines[$i]) )
        {
                $valid = 1;
        }
        /* The code below will only get executed if $token does NOT match the
           current token in the token file. The result of this will be that
           a valid token will not be written to the token file, and will
           therefore only be valid once. */
        else
        {
                fwrite($fd,$lines[$i]);
        }
}

/* We're done writing to $file, so it's safe release the lock. */
if( !(flock($fd,LOCK_UN)) )
        die("Could not release lock on $file!");

/* Save and close the token file: */
if( !(fclose($fd)) )
        die("Could not close file pointer for $file!");

/* If there was a valid token in $token, output the secret file: */
if( $valid )
{
        switch(strrchr(basename($Fichier_a_telecharger), ".")) {
 
case ".gz": $type = "application/x-gzip"; break;
case ".tgz": $type = "application/x-gzip"; break;
case ".zip": $type = "application/zip"; break;
case ".pdf": $type = "application/pdf"; break;
case ".png": $type = "image/png"; break;
case ".gif": $type = "image/gif"; break;
case ".jpg": $type = "image/jpeg"; break;
case ".txt": $type = "text/plain"; break;
case ".htm": $type = "text/html"; break;
case ".html": $type = "text/html"; break;
case ".avi": $type = "video/avi"; break;
default: $type = "application/octet-stream"; break;
 
}
 
header("Content-disposition: attachment; filename=".$filename); 
header("Content-Type: application/force-download"); 
header("Content-Transfer-Encoding: $type\n"); // Surtout ne pas enlever le \n
header("Content-Length: ".filesize($filedir)); 
header("Pragma: no-cache"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); 
header("Expires: 0"); 
readfile($filedir); 
}
else
{
        Header('Location:index.php');
}

?>
Mais ne fonctionne pas pour les fichiers gros!

ViPHP
ViPHP | 2577 Messages

15 oct. 2012, 15:37

Un message d'erreur serait appréciable.

Tu peux regarder la fonction fread() qui permet peut être la lecture de gros fichiers.

Eléphanteau du PHP | 21 Messages

15 oct. 2012, 18:19

C'est compliqué à utiliser fread() :O

Eléphanteau du PHP | 45 Messages

15 oct. 2012, 20:22

Corrigez moi ou fouettez moi mais il existe une méthode d'encryptage décryptage de code html entre pages me semble-t-il, non? J'avais vu ça y'a fort fort lointain mais me souviens plus où...

ViPHP
AB
ViPHP | 5818 Messages

16 oct. 2012, 02:06

C'est résolu ou pas ?
Dans un post tu dis que tu as réussi ... avec un code qui utilise readfile alors que tu dis plus haut que readfile() ne gère pas les gros fichiers ??, et cependant la doc indique :
readfile() ne présentera pas de problème mémoire, même lors de l'envoi de gros fichiers. Si vous rencontrez ce type de problème, assurez-vous que la mise en mémoire tampon de la sortie est désactivée avec la fonction ob_get_level().
Bref c'est pas clair #-o