IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

[ZF2.x]Download de fichier


Sujet :

Zend Framework PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut [ZF2.x]Download de fichier
    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

  2. #2
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Voici ma fonction finale, mais j'ai peur que ça plante si le fichier est trop gros car tout son contenu est lu en une fois et mis dans une variable...

    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
     
    public function downloadAction(){
    	$response = $this->getResponse();
     
    	$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" );
    	header("Expires: 01 Jan 1971 00:00:00 GMT"); // Date dans le passé pour forcer le rechargement
     
    	$handle = fopen($file, "r");
    	$content = fread($handle, $fileSize);
    	$response->setContent($content);
            return $response;
    }

  3. #3
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Et ça ne fonctionne pas sous IE7

  4. #4
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Citation Envoyé par narmataru Voir le message
    Et ça ne fonctionne pas sous IE7
    Ca fonctionne bien sous IE7 si je passe par un lien et non directement par l'url du navigateur...

    Que pensez-vous du méchanisme de charger tout le fichier dans une variable ?

Discussions similaires

  1. Réponses: 13
    Dernier message: 21/12/2005, 12h04
  2. download de fichier depuis un serveur web
    Par minusette dans le forum Modules
    Réponses: 9
    Dernier message: 14/10/2005, 09h10
  3. [Javabean/sun.net.ftp] Downloader un fichier txt
    Par benben13 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 13/09/2005, 16h43
  4. [C#] Download de fichier
    Par Scorff dans le forum ASP.NET
    Réponses: 2
    Dernier message: 27/06/2005, 10h09
  5. [VB.NET] Download de fichiers sur un serveur...
    Par Webman dans le forum ASP.NET
    Réponses: 3
    Dernier message: 19/05/2004, 10h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo