Bonjour,
Je veux télécharger un fichier au niveau du controller, j'ai suivi cette discussion :
http://www.grafikart.fr/forum/topic/548
mais c'est au niveau de la vue, et j'ai besoin de le télécharger après le remplissage d'un formulaire,
merci de m'aider et me dire comment procéder
Merci, mais ce n'est pas ce que je cherche,
je veux qu'un internaut mentionne son adresse mail et une fois qu'il clique sur ok, un fichier se télécharge,
un fichier qui se trouve déjà sur le serveur,
Salut,
Tu fais un formulaire classique, sauf qu'au lieu de rendre une vue HTML, tu renvoies une vue Media contenant ton fichier. En savoir plus sur la vue Media.
Merci, ça fonctionne parfaitement en local, mais une fois je l’héberge dans ovh
il m'affiche "The request not found":
voici mon code :
function charger () {
$this->viewClass = 'Media';
$filename = 'projet.xls';
$params = array(
'id' => $filename,
'name' => substr($filename, 0, strpos($filename, '.xls')),
'download' => true,
'extension' => 'xls',
'path' => 'files' . DS . 'outils' . DS,
'mimeType' => array('xls' => 'application/msexcel'
));
$this->set($params);
}
et dans l'action ou j'appelle charger() :
if ($this->User->save($this->data)) {
$this->redirect('/Users/charger');
}
et voici l'erreur qu'il m'affiche :
Error: The requested address '/index.php/Users/charger' was not found on this server.
Il ne faut pas appeler l'url en l'entrant directement mais en l'appelant par le Controller et l'action. Cela permettra au framework de trouver la bonne action.
Tu peux faire plus simple :
$this->response->file(
'le\chemin\depuis\webroot\nom-du-fichier-a-telecharger.extension', array(
'download' => true,
'name' => 'Le nom du fichier que tu veux retourner au visiteur.extension')
);
return $this->response;
Il te suffit soit de l'ajouter après toutes tes vérifications et actions du formulaire au controller, soit dans une autre action.
Cette technique fonctionne bien avec la dernière version de CakePhP et aucune vue n'est nécessaire.
Pour exemple, voici ce que j'ai fais.
Dans ma vue Posts/index.ctp :
<?= $this->Form->postButton('<i class="glyphicon glyphicon-download"></i>', array('action'=>'download'), array('class'=>'btn btn-success', 'escapeTitle'=>false)); ?>
Dans ma fonction download de mon PostsController :
public function download(){
if($this->request->is('post')){
$this->response->file('img\uploads\2013\09\0k3mrltqhw.jpg', array('download' => true, 'name' => 'Naruto Shippûden.jpg'));
return $this->response;
} else {
return $this->redirect(array('action' => 'index'));
}
}
Dans la documentation du Cookbook, ça correspond à ça :
Si vous voulez, vous pouvez aussi forcer un fichier à être téléchargé au lieu d’être affiché dans le navigateur en spécifiant les options:
$this->response->file($file'path'], array('download' => true, 'name' => 'foo'));
Que tu peux trouver ici : Envoyer des fichiers