Page 1 sur 1

problème download fichier

Posté : 07 juil. 2009, 16:29
par Invité
Bonjour à tous,
j'utilise le code ci dessous pour envoyer un fichier zip au navigateur, afin qu'on puisse télécharger.
Les paramètres viennent d'un requete sql qui semble fonctionner.
		header('Content-Type: application/octet-stream'); 
		header('Content-Disposition: attachment; filename="'.$filename.'"'); 
		header('Accept-Ranges: bytes'); 
		header('Content-Length: '.filesize($file) ); 
		
		readfile($file); 
Le fichier fait 115 Mo. au bout de 27 à 28 secondes en fonction des essais, le téléchargement est arrêté. Le fichier est sur mon disque dur mais ne fait que 24 Mo. Un essais de dézippage donne "archive corrompue".

Voyez vous dou ça pourrait venir?
Merci pour vos réponses.

Posté : 07 juil. 2009, 16:57
par enneite
tu peux tjs tenter
set_time_limit(0) 
en debut de script pour que le navigateur continue d'executer le script meme au bout de 30 secondes, par contre, ça va te prendre pas mal de ressources...

Sinon essaie en plus du time_limit(0) ceci:
$fp = fopen("$fichier","r" );	
$buff = fread($fp,filesize("$fichier"));
	header("Content-Type: application/x-octet-stream\n" );
	header( "Content-Disposition: attachment;filename=$fichier" );
	header('Pragma: no-cache');
	header('Expires: 0');
	echo $buff;

Posté : 09 juil. 2009, 07:32
par Invité
merci pour la réponse.

ça prend pas mal de ressources au niveau client ou serveur?
set_time_limit(0) change il le max execution du serveur?
est-ce que ça fonctionne même si mon hébergeur n'autorise pas la modif du php.ini?

Posté : 11 juil. 2009, 10:28
par sylvaing26
Si cela ne marche toujours pas, je te conseil de faire un upload en AJAX
http://www.pixeline.be/experiments/jqUploader/test.php
Personnelement je l'utilise et il fonctionne (même chez free)

Posté : 11 juil. 2009, 10:44
par Ryle
Sauf qu'il ne cherche pas à faire de l'upload, mais du download ;)

Le set_time_limit(0) te permet de redéfinir pour le script, le max execution time spécifié dans le php.ini. Tu ne modifies donc pas le fichier ini, mais il faut que ton hébergeur n'ait pas interdit cette fonction...

Côté ressources, c'est uniquement côté serveur, le client lui se contentant de télécharger le fichier que tu transmets, comme lors de n'importe quel téléchargement :)

Posté : 11 juil. 2009, 11:00
par sylvaing26
Sauf qu'il ne cherche pas à faire de l'upload, mais du download ;)
Oups, matinée difficile avec les yeux pas grands ouverts ... lol :roll:

Posté : 16 juil. 2009, 21:52
par Invité
merci à tous pour vos réponses. J'ai testé le téléchargement d'un zip de 9 mo qui prend normalement bien moins de 30 secondes à télécharger.

En fait, le téléchargement s'interrompt bien avant les 30 secondes. Il commence, et la barre de téléchargement passe à 100% en un éclair, en m'indiquant que mon fichier de 200 octets alors qu'il en fait 9 Mo.

ça n'a pas l'air d'être le max exectution time...d'ou cela peut il venir?

Je mets la totalité de mo code au cas où...c'est de l'objet Joomla mais normalement ça reste tout à fait compréhensible:
<?php
defined('_JEXEC') or die();

$dwldCode = JRequest::getVar('dwldCode', null); //récupération d'un code permettant au client de télécharger, envoyé en POST par un formulaire.
if ($dwldCode)
{
	//récup du nom de fichier comportant ce code dans la bdd
                $db =& JFactory::getDBO();
	$sql = "SELECT ao.nomFichier FROM #__add_codes AS ac, #__add_operations AS ao WHERE ac.idOperation = ao.id AND ac.nbDwldRea < ac.nbDwldAuto AND ac.published = 1 AND ao.published = 1 AND ac.code = '". $dwldCode ."'";
	$db	=& JFactory::getDBO();
	$db->setQuery($sql);
	$row = $db->loadObject();
	if ($row)
	{		
		
		
		$file = 'http://www.mondomaine.com/_FICHIERS/'. $row->nomFichier; 
		$filename = basename($file); 

	                //mon header, posté plus haut
		header('Content-Type: application/octet-stream'); 
		header('Content-Disposition: attachment; filename="'.$filename.'"'); 
		header('Accept-Ranges: bytes'); 
		header('Content-Length: '.filesize($file) ); 
		
		readfile($file); 
		
	}
	else
	{
		$msg = "Votre code n'est pas valide ou a expir&eacute;. <br /> Veuillez v&eacute;rifier le code ou vous en procurer un autre.";
	}	
}
?>
Merci à tous si vous avez une piste ou si ce type de pb vous est déjà arrivé avec un fichier, car je rame depuis des jours et je nage complètement.

Posté : 16 juil. 2009, 22:05
par Victor BRITO
Pourquoi faire compliqué quand on peut faire simple ? ;)

Un bout de code HTML, comme celui-ci :

Code : Tout sélectionner

<a href="url-de-l-archive.zip">Télécharger l'archive (zip, 115 Mo)</a>
ne te convient-il donc pas ?

Sache qu'en règle générale, un navigateur, lorsque l'utilisateur suit un lien vers une archive zip, affiche une boîte de dialogue proposant soit d'ouvrir l'archive soit de l'enregistrer (sans oublier l'annulation).

Posté : 16 juil. 2009, 22:52
par Invité
c'est devenu compliqué parceque je voulais contrôler un code avec une requete sql pour autoriser le téléchargement.

Si le client n'a pas le bon code, il ne doit pas pouvoir télécharger. Verrais-tu un moyen d'utiliser ta solution tout en ayant la possibilité de lancer une requete sql pour vérifier les autorisations de téléchargement?

Posté : 17 juil. 2009, 11:16
par Ryle
Et si tu faisais juste un header('Location:...') vers le fichier en question si l'utilisateur a le droit de le télécharger, au lieu de faire un readfile ?