从数据库BLOB下载yii Framework的链接

时间:2015-03-04 13:55:47

标签: php yii

我是Yii框架的新手,我不明白如何使用弹出窗口创建下载链接,询问您是否要保存文件。

到目前为止我所知道的事情:

  1. 我知道CHtml :: link(...)是如何工作的,并且已经强调了这一点。
  2. 我从db中提取Blob内容并将其保存在$ data->文件
  3. 我想点击的链接应该在CListView
  4. 我的数据库USERZ看起来像这样

    +---------+-------------+------+-----+---------+----------------+
    | Field   | Type        | Null | Key | Default | Extra          |
    +---------+-------------+------+-----+---------+----------------+
    | id      | int(11)     | NO   | PRI | NULL    | auto_increment |
    | file    | blob        | NO   |     | NULL    |                |
    | USER_id | int(11)     | NO   | MUL | NULL    |                |
    | zname   | varchar(40) | NO   |     | NULL    |                |
    | date    | date        | NO   |     | NULL    |                |
    +---------+-------------+------+-----+---------+----------------+
    

    我的控制器功能(SiteController.php)

    public function actionVerwal()
    {
        $model2=new USERZ;
        $this->render('verwal',array('model2'=>$model2));
    
    }
    

    和视图(verwal.php)

    <?php
     $this->widget('zii.widgets.CListView', array(
        'dataProvider'=>$model2->a(Yii::app()->user->getId()),
        'itemView'=>'_verwal',
    ));
    

    // function a($ id)只是确保提供了正确的用户数据

    我不理解的部分(_verwal.php):

    <b><?php echo CHtml::encode($data->getAttributeLabel('Files')); ?>:</b>
    <?php echo CHtml::link(CHtml::encode($data->zname), $data->file); ?>
    <br />
    

    如何将文件名转换为链接,以便提供下载。我有它需要文件的内容和名称,但我不知道如何把它们放在一起,并使它们成为1个下载文件弹出窗口。

1 个答案:

答案 0 :(得分:1)

文件下载由对您的应用程序的单独请求处理,从而产生文件头和文件头。信息被发送。

所以你要做的就是在控制器中创建一个名为public function actionDownload($id)的新动作。然后在您的视图中,您将链接到该操作。

<?php echo CHtml::link(CHtml::encode($data->zname), array('site/download', 'id' => $data->id)); ?>

我们发送数据的ID,以便操作知道它正在使用的模型。

$user = USERZ::model()->findByPk($id);

现在,您可以通过在下载操作中发送正确的标头来将用户文件发送给他们。

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=MY_FILE_NAME');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . count($user->file));
ob_start();
echo $user->file;
exit;

您不应该将文件存储在数据库中,考虑将它们存储在像protected / files这样的文件夹中。