En este capítulo del tutorial de Yii2 veremos como forzar la descarga de archivos del servidor, para tal tarea crearemos un nuevo método privado en el controlador llamado downloadFile($dir, $file, $extensions=[]), que se encargará de realizar la operación de descarga, este método retornará un valor boolean true-false.
Crearemos una acción-vista llamada download, en la vista incluiremos un link que no permitirá realizar la descarga de un archivo, si ocurre algún error al descargar el archivo mostraremos un mensaje flash, advirtiendo al usuario del error, de lo contrario el archivo se podrá descargar correctamente.
1 - Crear en la carpeta web una carpeta llamada archivos y agregar los archivos que podrán ser descargados (en el capítulo anterior "Subir archivos al servidor" esta carpeta ya fue creada).
2 - Crear la vista download ...
<?php use yii\helpers\Url; ?> <?php if (Yii::$app->session->hasFlash('errordownload')): ?> <strong class="label label-danger">¡Ha ocurrido un error al descargar el archivo!</strong> <?php else: ?> <a href="<?= Url::toRoute(["site/download", "file" => "yii.pdf"]) ?>">Descargar archivo</a> <?php endif; ?>
3 - Incluir el método privado downloadFile y la acción Download en el controlador ...
private function downloadFile($dir, $file, $extensions=[]) { //Si el directorio existe if (is_dir($dir)) { //Ruta absoluta del archivo $path = $dir.$file; //Si el archivo existe if (is_file($path)) { //Obtener información del archivo $file_info = pathinfo($path); //Obtener la extensión del archivo $extension = $file_info["extension"]; if (is_array($extensions)) { //Si el argumento $extensions es un array //Comprobar las extensiones permitidas foreach($extensions as $e) { //Si la extension es correcta if ($e === $extension) { //Procedemos a descargar el archivo // Definir headers $size = filesize($path); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=$file"); header("Content-Transfer-Encoding: binary"); header("Content-Length: " . $size); // Descargar archivo readfile($path); //Correcto return true; } } } } } //Ha ocurrido un error al descargar el archivo return false; } public function actionDownload() { if (Yii::$app->request->get("file")) { //Si el archivo no se ha podido descargar //downloadFile($dir, $file, $extensions=[]) if (!$this->downloadFile("archivos/", Html::encode($_GET["file"]), ["pdf", "txt", "doc"])) { //Mensaje flash para mostrar el error Yii::$app->session->setFlash("errordownload"); } } return $this->render("download"); }
Ver el vídeo tutorial de Yii Framework 2 en Youtube
1 comentario:
Hola buenas tardes, me gustaria saber si mepudes ayudar con mi proyecto, el problemo q tengo es que ya puedo suvir los archivos al servidor, pero necesito crear un formulario donde puedo buscar un archivo por el nombre y me lo muestre en una lista y me de la opcion de descargar?
Publicar un comentario