Page 1 sur 1

Problème de validité du fichier suite à un téléchargement

Posté : 28 juil. 2006, 11:53
par jdupuy
Bonjour,

J'ai mis en place une procédure de téléchargement de fichiers zip de manière à ce que chaque téléchargement soit sauvegardé dans la base de données et envoie un mail.
<?// Script qui enregistre les informations du formulaire dans la base,
// envoie un mail et active le téléchargement

//on se connecte à la base
	$u = "";
        $p = "";
        $h = "";
	$bdd = "";
	$connexion = mysql_connect($h, $u, $p) or die (mysql_error());
	mysql_select_db($bdd, $connexion)	or die (mysql_error());
	//si un fichier a été sélectionné (le lien cliqué)
if (isset($id))
	{	
		//on recherche dans la table tel de quel fichier il s'agit
		$request = "SELECT * FROM tel WHERE id_tel='$id'";
		$result = mysql_query($request, $connexion) or die ("Erreur dans la requête");
		//si l'identifiant a été trouvé
		if ($enreg = @mysql_fetch_array($result))
		{
		//on récupère les valeurs pour le nom et l'url
		$fichier = addslashes($enreg['nom_tel']);
		$url = $enreg['url_tel'];
		$date = date("Y-m-d H:i:s");
		mysql_close();
		
		//on charge le fichier
		// infos du fichier 
       		$fichier = $url;
		$f = substr(strrchr($url, "/"), 1);
		     
		// téléchargement du fichier 
		header('Content-disposition: attachment; filename='.$f); 
		header('Content-Type: application/force-download'); 
		header('Content-Transfer-Encoding: fichier');   
		header('Content-Length: '.filesize($fichier)); 
		header('Pragma: no-cache'); 
		header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); 
		header('Expires: 0'); 
		readfile($fichier); 
		}
}		
?>
L'URL est stocké dans une table de la base de données.
Les fichiers à télécharger sont des ZIP. Certains contiennent des PDF d'autres des EXE, ou autres formats de fichiers.
Mais avec cette méthode, certains visiteurs sous XP SP1 ou SP2 ont un fichier endommagé.

Si je remplace le fichier ZIP par un fichier PDF, Acrobat Reader ne parvient pas à le lire à l'issue du téléchargement.

Quelqu'un saurait-il me dire comment résoudre ce problème ?

Posté : 28 juil. 2006, 13:02
par Ryle
Si tu mets un simple lien pour accéder au fichier (zip et/ou pdf) au lieu de forcer le download, est ce que le fichier se télécharge et s'ouvre correctement ? (histoire d'essayer de cibler l'endroit d'où peur provenir le problème :))

Ps : utilise les balises [ php ] quand tu mets du code, ça le met en couleur et adapte la police, ce qui est plus lisible pour t'aider :)

Posté : 28 juil. 2006, 13:07
par zeus
Ps : utilise les balises [ php ] quand tu mets du code, ça le met en couleur et adapte la police, ce qui est plus lisible pour t'aider :)
C'est fait pour lui ;)

Posté : 28 juil. 2006, 14:15
par jdupuy
Si je mets :
header("Location: $url");
à la place de :
header('Content-disposition: attachment; filename='.$f); 
header('Content-Type: application/force-download'); 
header('Content-Transfer-Encoding: fichier');   
header('Content-Length: '.filesize($fichier)); 
header('Pragma: no-cache'); 
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); 
header('Expires: 0'); 
readfile($fichier);
ça fonctionne correctement a priori

Posté : 28 juil. 2006, 14:30
par Ryle
A priori c'est ton $f qui n'est pas bon. Ce doit être le nom du fichier (sans chemin ni fioritures), et je pense que ton substring est mal construit :)
Ca devrait plutôt être quelque chose du genre :
$f = substr($url, strrchr($url, "/")+1); 
Mais utilise plutôt basename() pour récuperer le nom du fichier, c'est plus simple et plus sur :)
$f = basename($url); 
Zeus >> Merci pour lui (pis pour nous aussi ;))

Posté : 28 juil. 2006, 14:44
par jdupuy
Merci de ton aide

Quand j'utilise :
$f = substr($url, strrchr($url, "/")+1);
et
echo $f;
ça me renvoie : ttp://www.geomod.fr/logiciels/mithra/MithraSIG.zip
il manque le h

Posté : 28 juil. 2006, 15:04
par Ryle
Oups, au temps pour moi, je me suis mélangé entre strrchr et strrpos.. :oops: j'ai rien dit, ce que tu avais fait était bon, sorry

Et si tu essayes avec ces headers là ?
header('Content-Type: application/octet-stream'); 
header('Content-disposition: attachment; filename='.$f); 
header('Accept-Ranges: bytes'); 
header('Content-Length: '.filesize($fichier)); 
readfile($fichier); 

Posté : 28 juil. 2006, 15:10
par jdupuy
Si j'utilise les headers du précédent message :
c'est Ok sous win 200
je n'arrive pas à ouvrir le zip sous XP SP1

mais le téléchargement fonctionne...