Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/05/2011, 14h02   #1
Membre actif
 
Inscription : avril 2010
Messages : 221
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 221
Points : 158
Points : 158
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 :
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.
mamax29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 16h22   #2
Membre expérimenté
 
Avatar de amoiraud
 
Homme Adrien
Développeur Web
Inscription : octobre 2006
Messages : 405
Détails du profil
Informations personnelles :
Nom : Homme Adrien
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 : 405
Points : 531
Points : 531
Envoyer un message via MSN à amoiraud
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é
amoiraud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 16h32   #3
Membre actif
 
Inscription : avril 2010
Messages : 221
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 221
Points : 158
Points : 158
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/
mamax29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 16h42   #4
Membre expérimenté
 
Avatar de amoiraud
 
Homme Adrien
Développeur Web
Inscription : octobre 2006
Messages : 405
Détails du profil
Informations personnelles :
Nom : Homme Adrien
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 : 405
Points : 531
Points : 531
Envoyer un message via MSN à amoiraud
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()
amoiraud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 17h03   #5
Membre actif
 
Inscription : avril 2010
Messages : 221
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 221
Points : 158
Points : 158
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 :
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 :
header('Content-Disposition: filename="'.$file_name.'"');
sous FF, le nom de fichier est correcte, mais le fichier téléchargé est vide...
mamax29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 12h12   #6
Membre actif
 
Inscription : avril 2010
Messages : 221
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 221
Points : 158
Points : 158
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 :
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");
}
mamax29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h06.


 
 
 
 
Partenaires

Hébergement Web