Yii从CGridView下载文件

时间:2014-06-05 11:20:30

标签: php yii

我在Yii上有一个表单,允许人们上传各种不同的文件格式。上传文件后,我有一个Db,为该文件添加一个条目:

+--------------+---------------+-------------+---------------+
|   id         |     name      |    acc_id   | date_uploaded |
+--------------+---------------+-------------+---------------+
|   1          |     test.png  |  100         | 2014-05-20   |
+--------------+---------------+-------------+---------------+

文件保存在根文件夹/ files /上传中,并使用id即1-test.png保存。

然后我可以在帐户上显示上传的文件,方法是在cgridview中显示与帐户id匹配的文件。

我遇到的问题是我需要一个下载按钮。我尝试了一些东西,似乎无法让它工作。我最接近的是使用以下代码

array(
        'class'=>'CLinkColumn',
        'header'=>'Download',
        'label'=>'Download',
        //'url' => '/files/uploaded/$data->id',
        'htmlOptions'=>array('width'=>'18'),
    ),

然而,$data变量似乎不起作用,我相信这与CLinkColumn有关。例如,如果我尝试使用UrlExpression,它总是添加index.php,我的文件永远不会被解析。有人能指出我如何解决这个问题的正确方向,也是存储和调用这些文件的最佳方法。

非常感谢

4 个答案:

答案 0 :(得分:2)

你可以试试这个:

<?php $this->widget('ext.CGridView', array(
    'id'=>'grid-id',
    'dataProvider'=>$dataProvider,
    'filter'=>$model,
    'columns'=>array(
            array(
            'name'=>'Download',
            //'header'=>'Download',
            'type'=>'raw',
            'value'=>'CHtml::link($data->FileNameFromModel, array("files/uploaded","id"=>$data->id))',
            //'htmlOptions'=>array('width'=>'10%'),
        ),
    .....
    )
    ));

答案 1 :(得分:1)

您可以为其添加自定义列:

'name' => 'name',
'header' => 'Download File',
'type' => 'raw',
'value' => 'CHtml::link("Click!", Yii::app()->createAbsoluteUrl("CONTROLLER/ACTION",array("id"=>$data->id)))'

通过上述解决方案,您的CGridView将会保留一个包含Download File标题的列,并且对于每一行,它会显示带有相关链接的Download File

注意,我使用CreateAbsoluteUrl创建了一个网址。如果您没有用于下载文件的控制器/操作,则可以使用自己的。

还可能需要注意的是,您必须将代码放在columns数组中:

'columns' =>array(
    array(...),
)

答案 2 :(得分:0)

同样的问题了。它没有帮助我。我不得不从protected / csv目录下载csv文件。我以另一种方式做到了。

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'user-export-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(

     /////////////////////

   array(
            'type'=>'raw',
            'name'=>'link',
            'value'=>'CHtml::link("$data->link", "http://" . $_SERVER["SERVER_NAME"] . Yii::app()->request->baseUrl . "/" . $data->link)',
        ),

    )));

答案 3 :(得分:0)

这应该允许从Gridview下载文件:

array('name'=>'file_name', 
      'type'=>'raw',
      'value'=>'CHtml::link($data->file_name, "uploads/materials/{$data->file_name}")',
      'filterHtmlOptions'=>array('style'=>'width: 40%;')),