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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème de validité du fichier suite à un téléchargement

par jdupuy » 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...

par Ryle » 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); 

par jdupuy » 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

par Ryle » 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 ;))

par jdupuy » 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

par zeus » 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 ;)

par Ryle » 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 :)

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

par jdupuy » 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 ?