problème download fichier

Invité
Invité n'ayant pas de compte PHPfrance

07 juil. 2009, 16:29

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.

Eléphant du PHP | 245 Messages

07 juil. 2009, 16:57

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;

Invité
Invité n'ayant pas de compte PHPfrance

09 juil. 2009, 07:32

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?

Mammouth du PHP | 686 Messages

11 juil. 2009, 10:28

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)

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

11 juil. 2009, 10:44

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 686 Messages

11 juil. 2009, 11:00

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:

Invité
Invité n'ayant pas de compte PHPfrance

16 juil. 2009, 21:52

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.

Mammouth du PHP | 2937 Messages

16 juil. 2009, 22:05

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

Invité
Invité n'ayant pas de compte PHPfrance

16 juil. 2009, 22:52

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?

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

17 juil. 2009, 11:16

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 ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...