Page 1 sur 1

Masquer URL de téléchargement

Posté : 14 oct. 2012, 16:55
par ABodyWithAHead
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 !

Re: Masquer URL de téléchargement

Posté : 14 oct. 2012, 17:47
par xTG
Une table de correspondance id / chemin ;)

Re: Masquer URL de téléchargement

Posté : 14 oct. 2012, 18:13
par ABodyWithAHead
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.

Re: Masquer URL de téléchargement

Posté : 14 oct. 2012, 18:23
par Mazarini
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().

Re: Masquer URL de téléchargement

Posté : 14 oct. 2012, 18:37
par ABodyWithAHead
Hum, peux-tu m'éclairer avec readfile() ?

Re: Masquer URL de téléchargement

Posté : 15 oct. 2012, 12:52
par moogli
regarde la doc de la fonction header il y a un exemple similaire à ce que tu veux faire.


@+

Re: Masquer URL de téléchargement

Posté : 15 oct. 2012, 13:01
par ABodyWithAHead
J'ai un problème avec readfile() : les gros fichiers ne sont pas gérés :/

Re: Masquer URL de téléchargement

Posté : 15 oct. 2012, 13:17
par ABodyWithAHead
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!

Re: Masquer URL de téléchargement

Posté : 15 oct. 2012, 15:37
par Mazarini
Un message d'erreur serait appréciable.

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

Re: Masquer URL de téléchargement

Posté : 15 oct. 2012, 18:19
par ABodyWithAHead
C'est compliqué à utiliser fread() :O

Re: Masquer URL de téléchargement

Posté : 15 oct. 2012, 20:22
par asf21
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ù...

Re: Masquer URL de téléchargement

Posté : 16 oct. 2012, 02:06
par AB
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