登录

Fastadmin在数据库管理中加入备份下载功能

PHP笔记
0 1227

效果图:image.png

实现步骤:1、在备份列表模板中,文件名加入超级链接。文件位于:application\admin\view\general\database\index.html

 <%=backuplist[i].file%> 

2、在控制器中,加入download()操作。在文件:application\admin\controller\general\Database.php

/**
     * 下载备份文件
     * @internal
     */
    public function download()
    {
        $config = get_addon_config('database');
        $file = $this->request->get('file');
        $backupDir = ROOT_PATH . 'public' . DS . $config['backupDir'];
        $file2 = $backupDir . $file;

        $download =  new \think\response\Download($file2);
        $download->mimeType('zip');
        return $download->name($file);
    }

3、在thinkphp\library\think\response\目录中,加入Download.php文件(可以在thinkphp5.1.21+中找到,文档参考):


// +----------------------------------------------------------------------

namespace think\response;

use think\Exception;
use think\Response;

class Download extends Response
{
   protected $expire = 360;
   protected $name;
   protected $mimeType;
   protected $isContent = false;
   protected $openinBrowser = false;
   /**
    * 处理数据
    * @access protected
    * @param  mixed $data 要处理的数据
    * @return mixed
    * @throws \Exception
    */
   protected function output($data)
   {
       if (!$this->isContent && !is_file($data)) {
           throw new Exception('file not exists:' . $data);
       }

       ob_end_clean();

       if (!empty($this->name)) {
           $name = $this->name;
       } else {
           $name = !$this->isContent ? pathinfo($data PATHINFO_baseNAME) : '';
       }

       if ($this->isContent) {
           $mimeType = $this->mimeType;
           $size     = strlen($data);
       } else {
           $mimeType = $this->getMimeType($data);
           $size     = filesize($data);
       }

       $this->header['Pragma']                    = 'public';
       $this->header['Content-Type']              = $mimeType ?: 'application/octet-stream';
       $this->header['Cache-control']             = 'max-age=' . $this->expire;
       $this->header['Content-Disposition']       = $this->openinBrowser ? 'inline' : 'attachment; filename="' . $name . '"';
       $this->header['Content-Length']            = $size;
       $this->header['Content-Transfer-Encoding'] = 'binary';
       $this->header['Expires']                   = gmdate("D d M Y H:i:s" time() + $this->expire) . ' GMT';

       $this->lastModified(gmdate('D d M Y H:i:s' time()) . ' GMT');

       $data = $this->isContent ? $data : file_get_contents($data);
       return $data;
   }

   /**
    * 设置是否为内容 必须配合mimeType方法使用
    * @access public
    * @param  bool $content
    * @return $this
    */
   public function isContent($content = true)
   {
       $this->isContent = $content;
       return $this;
   }

   /**
    * 设置有效期
    * @access public
    * @param  integer $expire 有效期
    * @return $this
    */
   public function expire($expire)
   {
       $this->expire = $expire;
       return $this;
   }

   /**
    * 设置文件类型
    * @access public
    * @param  string $filename 文件名
    * @return $this
    */
   public function mimeType($mimeType)
   {
       $this->mimeType = $mimeType;
       return $this;
   }

   /**
    * 获取文件类型信息
    * @access public
    * @param  string $filename 文件名
    * @return string
    */
   protected function getMimeType($filename)
   {
       if (!empty($this->mimeType)) {
           return $this->mimeType;
       }

       $finfo = finfo_open(FILEINFO_MIME_TYPE);

       return finfo_file($finfo $filename);
   }

   /**
    * 设置下载文件的显示名称
    * @access public
    * @param  string $filename 文件名
    * @param  bool   $extension 后缀自动识别
    * @return $this
    */
   public function name($filename $extension = true)
   {
       $this->name = $filename;

       if ($extension && false === strpos($filename '.')) {
           $this->name .= '.' . pathinfo($this->data PATHINFO_EXTENSION);
       }

       return $this;
   }

   /**
    * 设置是否在浏览器中显示文件
    * @access public
    * @param  bool  $openinBrowser 是否在浏览器中显示文件
    * @return $this
    */
   public function openinBrowser($openinBrowser) {
       $this->openinBrowser = $openinBrowser;
       return $this;
   }
}

发表评论

0 个回复