使用 yii 框架从数据库 BLOB 下载 link

Download link from Database BLOB with yii Framework

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

我目前知道的和拥有的:

  1. 我知道 CHtml::link(...) 的工作原理并且已经实现了。
  2. 我从数据库中提取了 Blob 内容并将其保存在 $data->file
  3. 我想点击的link应该在CListView里面

我的数据库 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',
));

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

不明白的部分(_verwal.php):

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

如何将文件名变成 Link 以便提供下载。我拥有所有需要的文件内容和名称,但我不知道如何将它们放在一起并将它们制作成 1 个下载文件弹出窗口。

文件下载由对您的应用程序的单独请求处理,该请求导致文件 headers 和信息被发送。

所以你想要做的是在你的控制器中创建一个名为 public function actionDownload($id) 的新动作。然后在您看来您将link执行该操作。

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

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

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

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

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 这样的文件夹中。