我是Yii Framework的新手,我不知道如何创建一个带有弹出窗口的下载链接,该窗口询问您是否想要保存文件。
到目前为止我所知道和拥有的:
- 我知道CHtml::link(…)是如何工作的,并且已经实现了这一点
- 我从数据库中提取了Blob内容,并将其保存在$data->文件中
- 我想点击的链接应该在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 />
如何将文件名设置为链接,以便提供下载。我有所有它需要的文件的内容和名称,但我不知道如何将它们放在一起,并使它们成为一个下载文件弹出窗口。
文件下载由对应用程序的单独请求处理,该请求将产生文件头&正在发送信息。
所以你想做的是在你的控制器中创建一个新的动作,叫做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这样的文件夹中。