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

Petit nouveau ! | 4 Messages

28 juil. 2006, 11:53

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 ?

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

28 juil. 2006, 13:02

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 :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

28 juil. 2006, 13:07

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 4 Messages

28 juil. 2006, 14:15

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

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

28 juil. 2006, 14:30

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 ;))

Petit nouveau ! | 4 Messages

28 juil. 2006, 14:44

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

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

28 juil. 2006, 15:04

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); 

Petit nouveau ! | 4 Messages

28 juil. 2006, 15:10

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...