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 :

Télécharger un fichier situé dans une répertoire externe [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut Télécharger un fichier situé dans une répertoire externe
    Bonjour,

    Depuis mon application web, je souhaite intégrer une fonction permettant de télécharger un fichier situé dans un autre emplacement de mon serveur.

    Pour cela j'ai réalisé le script suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    function detect_browser($var)
    {
    	if(preg_match('/MSIE/', $var))
    	{
    		$browser = "ie";
    	}
    	else
    	{
    		$browser = "";
    	}
    	return $browser;
    }
     
    // récupération du nom de fichier
    $file_name = $_GET['file'];
    // recréation du path complet
    $file_path = create_path($_SESSION['path']);
     
    if ( file_exists($file_path.$file_name) )
    {
    	$size = filesize($file_path.$file_name);
     
    	header('Content-Description: File Transfer');
    	if(detect_browser($_SERVER['HTTP_USER_AGENT']) == "ie")
    	{
    		header('Content-type: application/force-download');
    	}
    	else
    	{
    		header('Content-Type: application/octet-stream');
    	}
    	header('Content-Transfer-Encoding: binary');
    	header('Content-Length: $size');
    	header('Content-Disposition: filename="'.$file_name.'"');
     
    	// open the file for reading and start dumping it to the browser
    	if($fp = fopen($file_path.$file_name, "r")) {
    		while(!feof($fp)) {
    			echo fgets($fp, 4096);
    		}
    		// close the file
    		fclose($fp);
    	}
    }
    else
    {
    	header("Location: ./index.php");
    }
    Ce script fonctionne relativement bien a l'exception des cas suivants:
    1) sous IE (8) le téléchargement ne fonctionne pas...
    2) dans le cas d'un nom de fichier avec des espaces cela ne fonctionne pas nom plus...

    J'ai pourtant appliqué ce que j'ai pu glaner sur le web, mais sans résultat


    Si quelqu'un peut m'éclairer sur cela.

  2. #2
    Membre éprouvé
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 606
    Points : 1 057
    Points
    1 057
    Par défaut
    Salut,
    pour le bug je sait pas, mais si j'ai bien compris ton code tu autorise l'utilisateur à télécharger n'importe quel fichier passé en GET ?
    Vraiment pas top niveau sécurité

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    Pour l'aspect sécurité cela ne pose pas de problème.

    C'est un espace sur mon serveur qui demande une authentification par login mot de passe (md5), qui utilise des sessions et en https. il faut donc être identifier pour pouvoir utiliser ce script.

    le principe de ce script c'est de pouvoir facilement avec une interface agréable via un navigateur web de télécharger des fichiers sur un espace Webdav.

    en gros j'ai mon server root : /var/www/le_site/
    et mon répertoire Webdav: /var/www/le_site/webdav/

  4. #4
    Membre éprouvé
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 606
    Points : 1 057
    Points
    1 057
    Par défaut
    Citation Envoyé par mamax29 Voir le message
    Pour l'aspect sécurité cela ne pose pas de problème.

    C'est un espace sur mon serveur qui demande une authentification par login mot de passe (md5), qui utilise des sessions et en https. il faut donc être identifier pour pouvoir utiliser ce script.

    le principe de ce script c'est de pouvoir facilement avec une interface agréable via un navigateur web de télécharger des fichiers sur un espace Webdav.

    en gros j'ai mon server root : /var/www/le_site/
    et mon répertoire Webdav: /var/www/le_site/webdav/
    OK autant pour moi,

    Sinon pour le problème des fichiers avec des espaces, je suis pas sûr mais essaye avec un url_encode() qui te remplacera les noms de fichiers par des %20 dans ton paramètre GET, ensuite tu le décode lorsque tu le récupère avec un url_decode()

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    Disons que dans un premier temps c'est pas trop le problème des espaces, c'est plus l'utilisation avec IE qui pose problème car avec lui aucun téléchargement ne fonctionne..

    Pour les espaces, j'ai essayé pas mal de chose:

    supposont que $file_name = "mon fichier.doc"

    avec cette directive là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Disposition: filename=$file_name');
    sous FF, le téléchargement fonctionne, mais le nom de fichier est incorrect, lors du téléchargement du fichier celui-ci se nommera: "mon", le reste du nom est supprimé

    avec celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Disposition: filename="'.$file_name.'"');
    sous FF, le nom de fichier est correcte, mais le fichier téléchargé est vide...

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    Bon, après pas mal de temps passé sur la doc wouaibistique j'ai enfin trouvé la solution qui résout tous les problèmes évoqués précédemment.

    1) Il y a un ordre à respecter dans les header
    2) la syntaxe pour les fichiers avec un espace est aussi à prendre en compte

    voici ci-dessous le script complet qui fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // get filename and path
    $file_name = $_GET['file'];
    $file_path = create_path($_SESSION['path']);
     
    if ( file_exists($file_path.$file_name) )
    {
     
    	// Retourn la taille du fichier
    	$size = filesize($file_path.$file_name);
     
    	// Envoi des header
    	header('Content-Description: File Transfer');
    	header('Content-Type: application/octet-stream');
    	header('Content-Disposition: attachment; filename="'.$file_name.'"');
    	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: '.$size);
     
    	ob_clean();
    	flush();
    	readfile($file_path.$file_name);
    }
    else
    {
    	header("Location: ./explore.php");
    }

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

Discussions similaires

  1. Télécharger des fichiers stockés dans répertoire spécifique dans le serveur
    Par Devloppor dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 22/12/2014, 12h51
  2. Réponses: 9
    Dernier message: 31/01/2014, 16h55
  3. [AC-2010] Récupérer dans une table la liste des fichiers contenus dans un répertoire
    Par possible924 dans le forum VBA Access
    Réponses: 6
    Dernier message: 22/02/2013, 22h00
  4. Drop Down Menu : Récuperer le nombre des fichiers dans une répertoire
    Par slim.bouzrati dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 08/05/2012, 00h16
  5. Réponses: 1
    Dernier message: 15/05/2010, 14h37

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