8768 sujets

Développement web côté serveur, CMS

Bonjour,
Dans une fonction PHP je télécharge du serveur vers l'utilisateur un fichier. Et je souhaite après ce téléchargement rafraichir la page affichée. Et je n'y arrive pas.
Voici le code :
function televersement($datas)
/***
 * Telechargement de l'archive 
 */
{
	$repertoire = PATHABSOLU . PUBCERFA . $datas['fichier_archive'];

	if (!file_exists($repertoire)) {
		$_SESSION['message'][] = 'Le fichier archive '.$datas['fichier_pdf_valider'].' est absent.';
		$datas['retour'] = false;
		return $datas;
	}

	//$contenu = ob_get_contents();
	while (ob_get_level()) {
		ob_end_clean();
	}

	chmod($repertoire, 0777);
	ini_set('zlib.output_compression', 0);
	header('Pragma: public');
	header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
	header('Content-Tranfer-Encoding: none');
	header("Content-type: application/zip; name=" . $datas['fichier_archive'] . '"');
	header('Content-Disposition: attachment; filename="' . $datas['fichier_archive'] . '"');
	header("Content-Length: " . filesize($repertoire));
	header('Date: ' . date("Y-m-d H:i:s"));
	header("Expires: 0");
	flush();
	readfile($repertoire);

	header('location:'.URL_SITE.'index.php?app=88&act=accueil');
	exit();
}

J'ai ce message d'erreur :
"PHP Warning: Cannot modify header information - headers already sent in......"
Y a t'il une solution ?
Merci pour votre aide.
Salut,

a priori si tu as déjà envoyé les headers tu ne pourras pas en renvoyer un nouveau pour recharger la page.
Je pense que tu dois pouvoir envoyer un bout de code javascript qui fera le rechargement de la page.

Cela manque un peu de contexte, mais par hasard, est ce qu'il n'est pas possible de lancer le téléchargement dans un autre onglet (par exemple) pour garder ta page normal sans avoir à la recharger ?
Bonjour Mathieuu
J'ai essayé d'envoyer le code JS
echo '<script type="text/JavaScript"> location.reload(); </script>';

avant les headers mais ça n'a pas rechargé la page.
Je pense qu'en effet la solution est de séparer le téléchargement du code actuel. mais ça fait une action supplémentaire pour l'utilisateur.
Bonjour,

Une solution possible pour effectuer la redirection après le téléchargement sur la même réponse HTTP semble être d'utiliser une réponse HTTP Multipart. Tu peux voir un exemple proposé sur la 2e réponse de cette discussion : https://stackoverflow.com/questions/5574878/force-download-with-php-then-redirect
Néanmoins, il semble y avoir un doute sur le fait que cette solution soit correctement supportée.

A priori la solution classique des sites de téléchargement est de procéder de manière inverse : d'abord effectuer la redirection vers la page cible puis lancer le téléchargement depuis la page redirigée.
Oui Pitet je viens de faire un essai de cette 2ème solution sous Firefox. J'ai le message "Violation de protocole réseau ...."
Je vais modifier mon code pour séparer la création du fichier à télécharger de son téléchargement. Ce qui résout le rafraichissement de page.

Mathieuu, Pitet merci pour votre aide.
solution très simple

 echo'<meta http-equiv="refresh" content="3;URL=index.php?app=88&act=accueil">';


Tu met ton temps comme tu veux change le 3 en 0 cela seras imédiat
Modifié par djmanu68 (17 Dec 2022 - 18:26)
Merci djmanu68,
Mais ça ne résout pas le rafraichissement de la page après un téléchargement.
Je vais modifier mon code. Je pense que c'est le plus simple