Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'essaie de proposer un document Word en téléchargement via le code suivant:
public function downloadAction()
{
Zend_Layout::getMvcInstance()->disableLayout(true);
$this->_helper->viewRenderer->setNoRender();
$localfile = '....test.doc';
$contents = file_get_contents($localfile);
$this->getResponse()->setHeader("Cache-Control","no-cache, must-revalidate");
$this->getResponse()->setHeader("Content-Type", "application/msword");
$this->getResponse()->setHeader("Content-Disposition", 'attachment; filename="test.doc"');
$this->getResponse()->setBody($contents);
/*
header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: application/msword");
header('Content-disposition: attachment; filename="test.doc"');
header('Content-Length: '.filesize($localfile)); */
echo $contents;
}
Mais cela ne fonctionne pas, il me renvoie un fichier bizarre avec des lignes du genre:
ÐÏ#ࡱ#á################>###þ
J'ai essayé avec différents Content-Type mais rien n'y fait...
Par contre cela fonctionne parfaitement pour un fichier pdf ou csv...
J'ai testé avec les "header" dans un simple script php et là ça fonctionne parfaitement! Serait-ce dû à un problème d'encodage?
Je sèche un peu là donc toute aide est la bienvenue ! :-)
merci
Hors ligne
ou setBody prend en argument une chaine de caractère et non un contenu binaire
Hors ligne
et concrètement, que dois-je faire alors?
thks!
Hors ligne
Je dis peut-être une bétise, je n'ai pas essayé^^, mais test ceci :
public function downloadAction()
{
Zend_Layout::getMvcInstance()->disableLayout(true);
$this->_helper->viewRenderer->setNoRender();
fopen("....test.doc", "r");
}
Hors ligne
Bon je dois moi aussi télécharger des fichiers .doc dans mon appli, ce que je t'ai proposé ne marche pas (m'en doutais j'ai dit ça un peu au hasard^^)
J'ai essayé plusieurs choses, j'en suis là :
public function telechargerAction() { //chdir('../bulletins/'); Zend_Layout::getMvcInstance()->disableLayout(); $fileToDown = (string)$this->_request->getParam('file', null); $this->_helper->viewRenderer->setNoRender(); //$localfile = '....test.doc'; //$contents = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/application/bulletins/' . $fileToDown); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Description: File Transfer'); header('Pragma: public'); header('Expires: 0'); header('Content-Transfer-Encoding: binary'); header('Content-Type: application/octet-stream'); header('Content-Length: '.filesize($_SERVER['DOCUMENT_ROOT'] . '/application/bulletins/' . $fileToDown)); header('Content-Disposition: attachment; filename='.$fileToDown); //ob_clean(); //flush(); readfile($_SERVER['DOCUMENT_ROOT'] . '/application/bulletins/' . $fileToDown); }
Mais toujours pareil le fichier téléchargé a son contenu totalement modifié et word me demande une conversion à l'ouverture. Je ne trouve pas la solution, ça ne doit pas être comme ça qu'on fait (forcément^^) si tu as résolu le problème, ou toute autre personne ayant la solution, alors : prière de partager votre science
Hors ligne
up :x
Hors ligne
Salut,
je sais pas si tu as réussi à résoudre ton problème. Comme j'ai dû mettre récemment en place un lien et forcer le téléchargement d'un document word pour un client, je te met à disposition les quelques lignes de code.
Dans mon controller :
$this->_helper->layout->disableLayout(); $filename = $this->_request->getParam('file',null); if(empty($filename)){ // Vérifie qu'on reçoit bien un nom de fichier exit; } $this->view->filename = $filename;
Dans ma vue :
<?php // information concernant le fichier à télécharger $dir = 'public/doc/'; $nom_fichier = $this->filename; $fichier = $dir.$nom_fichier; // téléchargement du fichier header('Content-disposition: attachment; filename='.$nom_fichier); header('Content-Type: application/force-download'); header('Content-Transfer-Encoding: fichier'); header('Content-Length: '.filesize($fichier)); header('Pragma: no-cache'); header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); header('Expires: 0'); readfile($fichier);
a+
Hors ligne
Bonjour,
Sinon il y a cette fonction très utile que j'ai trouvé sur php.net.
function dl_file($file){ //First, see if the file exists if (!is_file($file)) { die("<b>404 File not found!</b>"); } //Gather relevent info about file $len = filesize($file); $filename = basename($file); $file_extension = strtolower(substr(strrchr($filename,"."),1)); //This will set the Content-Type to the appropriate setting for the file switch( $file_extension ) { case "pdf": $ctype="application/pdf"; break; case "exe": $ctype="application/octet-stream"; break; case "zip": $ctype="application/zip"; break; case "doc": $ctype="application/msword"; break; case "xls": $ctype="application/vnd.ms-excel"; break; case "ppt": $ctype="application/vnd.ms-powerpoint"; break; case "gif": $ctype="image/gif"; break; case "png": $ctype="image/png"; break; case "jpeg": case "jpg": $ctype="image/jpg"; break; case "mp3": $ctype="audio/mpeg"; break; case "wav": $ctype="audio/x-wav"; break; case "mpeg": case "mpg": case "mpe": $ctype="video/mpeg"; break; case "mov": $ctype="video/quicktime"; break; case "avi": $ctype="video/x-msvideo"; break; //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files) case "php": case "htm": case "html": case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>"); break; default: $ctype="application/force-download"; } //Begin writing headers header("Pragma: public"); header("Expires: 0"); header("Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: public"); header("Content-Description: File Transfer"); //Use the switch-generated Content-Type header("Content-Type: $ctype"); //Force the download $header="Content-Disposition: attachment; filename=".$filename.";"; header($header); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".$len); @readfile($file); exit; }
Hors ligne
Cette fonction de php.net est parfaite, ce qui explique qu'il n'y a eu aucune réponse après. Je pense qu'il est préférable de passer ce sujet en résolu.
Hors ligne
Un petit lien qui explique comment gérer tout ça au niveau du controleur :
(c'est pour afficher des images, mais le principe est là..)
http://www.nabble.com/Getting-JPEGs-fro … #a20133957
Hors ligne
Bonjour yannux!
le lien qui explique comment gérer tout ça au niveau du controleur :
(c'est pour afficher des images, mais le principe est là..) est inactif et j'aimerais avoir un peu plus d'information à ce sujet.
la fonction donné ci-dessus par nopitch
function dl_file($file) qui semble bien fonctionné ne retrouve pas le fichier rechercher chez hebergeur,
voila mon controller qui apel cette fonction
public function indexAction() { $file = 'downpload/'.$namefile; $this->dl_file($file); } .
j'obtiens un fichier introuvable hors il existe bien car j'au pu l'envoyer chez mon heberger, mais j'arrive pas à le telecharger
Merci
Merci
Hors ligne
Essaye de mettre un chemin absolue et non relatif.
Attention je ne sais pas si c'est "normal" mais tu as écris "downPload" un peu en trop peut être en recopiant ici...
Hors ligne
voilà l'arborescence de mon site chez mon hebergeur:
|-- application | |-- configs | |-- controllers | |-- models | `-- views |-- library |-- public | |-- download | `-- index.php `-- tests |-- library .
et le fichier à télécharger se trouver dans le repertoire download de public
avec la fonction getcwd(); me donner bien ma position dans mon arborescence
donc
$dir= 'downloap/'.$nomdufichier;
mais il est introuvable et telecharger depuis mon notepad NppFTP
mais pas à travers mon site
Hors ligne
Bonjour!
'ai pas toujour resolu mon problème de téléchargement de fichier chez mon hebergeur.
$file = getcwd()."./download/".$Filename;
mon chemin est absolue mais le fichier reste introuvable
merci d'avance pour votre aide
Hors ligne