Lignes supplémentaire quand je force le téléchargement

Petit nouveau ! | 6 Messages

17 févr. 2010, 16:47

Bonjour,

Sur l'application que je suis en train de développé, j'ai besoin de forcer l'utilisateur à télécharger des fichiers, sans qu'il s'ouvrent.
Je rencontre deux problèmes :
- Sur IE6 SP1, les utilisateurs ne peuvent pas télécharger les fichiers "Internet Explorer ne peut pas télécharger le fichier download.php?file=317"
- sur Firefox, le téléchargement s'effectue mais le problème vient du fait qu'au début de mon fichier j'ai 4 lignes vides qui ne sont pas présentes dans le fichier d'origine.

J'ai essayé énormemment de combinaison de header sans succès, je me tourne donc vers vous en espérant que l'un d'entre vous ait déjà rencontré ce problème.

Voilà le code, la partie "directopen" fonctionne, c'est dans le else le soucis :
<?php
require_once "libs.class.php";
include "functions.inc.php";

session_start();

$config = parse_ini_file(dirname(__FILE__)."/../config/genesia.ini", true);

mysql_pconnect($config['database']['server'], $config['database']['user'], $config['database']['password']);
mysql_select_db($config['database']['base']);

$file = new File($_REQUEST['file']);
$file->updateFromDB();
$path = "../".$file->getPath();
$fileName = $file->getName();
$fichier = $file->getFile();

// directopen
if(isset($_REQUEST['directopen'])){

	$tmpDir= "../files/tmp";
	$sessionId = session_id();
	$tmpSessionDir = $tmpDir."/".$sessionId;
	$oldUMask = umask(0);
	if(!file_exists($tmpSessionDir)){
		mkdir($tmpSessionDir,0775,true);
	}
	umask($oldUMask);
	//copie systematique
	$fileName = stripAccent($fileName);
	copy($path.$fichier,$tmpSessionDir."/".$fileName);
	$newPath = $tmpSessionDir."/".$fileName;
	
	header("Location: $newPath");
}
else {	
	header("Content-type: application/force-download");
	header("Content-type: application/octet-stream");
	header("Content-Length: ".filesize($path.$fichier));
	header("Content-Disposition: attachment; filename=\"$fileName\"");	
}
readfile($path.$fichier);

?>
Merci d'avance,

Damien

Eléphanteau du PHP | 12 Messages

17 févr. 2010, 20:01

J'ai aussi eu du mal quand j'ai du faire ce genre de chose (surtout pour trouver les en-têtes qui vont bien).
Au final, j'ai ce code qui marche bien chez moi (y a pas tout, juste ce qui pourrait t'être utile):
			$finfo = new finfo(FILEINFO_MIME);
			if ($finfo)
				$mime = $finfo->file($full_path);
			else
				$mime = 'application/force-download';
			
			
			header('Content-Type: '. $mime .'; name="'. $filename .'"');
			header('Content-Transfer-Encoding: binary');
			header('Content-Length: '. $filesize);
			header('Cache-Control: private, must-revalidate');	// !!! Cache-control: PRIVATE (et pas "no-cache")
			header('Content-Disposition: attachment; filename="'. $filename .'"');
			header('Expires: 0');
			header('Pragma: no-cache');
			
			
			readfile($full_path);
En espérant que ça t'aide.