Bonjour,

Je voudrais lancer le téléchargement d'un fichier à partir de zend.

Voici le code PHP 'standard' que je voudrais faire :

(http://php.net/manual/fr/function.readfile.php)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$file = 'monkey.gif';
 
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>
Voici ce que j'ai commencé à faire avec zend :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
	public function downloadAction(){
		$response = $this->getResponse();
 
		$downloadFactory = $this->getServiceLocator()->get('\Downloads\DownloadsFactory');
 
		$file = getcwd() . '/public/attachments/128/aaa.pdf';
		$fileName = basename($file);
		$fileSize = filesize($file);
 
 
        $response->setStatusCode(200);
        $headers = $response->getHeaders();
        $headers->addHeaderLine('Content-type: application/force-download');
        $headers->addHeaderLine("Content-Disposition: attachment; filename=" . $fileName); 
		$headers->addHeaderLine("Content-Description: File Transfert" );
		$headers->addHeaderLine("Content-Transfer-Encoding: binary" );
		$headers->addHeaderLine("Content-Length: " . $fileSize );
		$headers->addHeaderLine("Pragma: no-cache" );
		$headers->addHeaderLine("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );
		$headers->addHeaderLine("Expires: 0" );
 
        //$response->setContent($content);
        var_dump($headers);
        //return $response;
	}
Si j'utilise la fonction 'readfile()' je vais avoir un conflit entre $response et readfile qui envoie directement le résultat de la lecture sur le buffer de sortie.

Je peux utiliser fread pour récupérer le contenu et le mettre dans le contenu de ma réponse :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
$contents = fread($handle, filesize($filename));
$response->setContent($content);
Mais celà ne pose-t-il pas un problème ? Si la taille du fichier est important, $response risque d'être trop 'lourde' non ?

Quelle serait la bonen manière pour télécharger un fichier de n'importe quelle taille avec zend ?

Merci