miércoles, 25 de febrero de 2015

Yii Framework 2 - Force Download (Forzar descarga de archivos del servidor)




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:

nelson redondo barros dijo...

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?