Yii2 SendFile() 显示一些字符而不是下载

问题描述 投票:0回答:4

我有控制器代码:

 public function actionDownload($id) {

        $download = Status::findOne($id);

        $path = Yii::getAlias('@webroot').'/uploads/status/'.$download->image_web_filename;

        if (file_exists($path)) {
            return Yii::$app->response->SendFile($path,$download->image_src_filename);
           
            exit;
        } else {
            throw new NotFoundHttpException("can't find {$download->image_src_filename} file");
        }
    }

我在GridView中有视图代码:

 ['attribute'=>'Download',
       'format'=>'raw',
        'value' => function($data)
        {
        return
        Html::a('Download file', ['status/download','id'=>$data->id],['class' => 'btn btn-primary']);

        }
        ],

这是屏幕上显示的内容。只有当我刷新浏览器时才会下载 pdf,但它仍然保留在屏幕上,这是什么问题?:

%PDF-1.4 %�쏢 5 0 obj <> stream x��]K�%ECű%P4���y��.�u�@�Q �zt��P�0��_��'��gx����/3�n���zܞ���xaAR7o�s�<�;�����܈�o��w?8��]�y�/'�O�FU��@b㍤���G����͇'r����4�+B��{3���SW����'��<�������A�ǃ*x���N27r�$���V������w�_?��k�~���+�'wFr6��f! ��ȍ7�Ӡ���UG���g;=�2�j��Ǒ �oƱQƇfh�?�WҘ�0۟��/�l�E���i(�{��* ��'�W��8��T�j 2��p������\��aܵH�$�Ci��u��$j��QZ���aIk����\o���D2Y)�/FV��nġ�a����� �_ؐ��rf�� �7�*� �IN�J{�l����Cqr�D�������[�]9���E�7�����k�j���9N�\�EC��F����&ռ-����uJV����3����L!�f��x���F�����̈́��#��U����:*g��&C�ӤD��q�17�@Jg+�J����w��ߨ?M_�a���R�ݼ��zu%��\�#�7$M&���-dO"#�]�i�89�}��<��� m��04�I�bHJ �O�M��`f�Ϯ�E�{2}`���n�����.l���+cZ?�����6C��N��XZJW�ylȒ��"�D�ͧ�8s���q��o׉m��ݍx�6(��T�9Uɨ�g���x���\���'�Ͻ����BE��|��� p���9P]��R*����C��������jC�m���1��#K���׶Y���rt=�:�x����W����qr�便p4��"��B�}=�2������p��!x+�)zv���̳���\^*�R�ugȎ!J<��q�~���C��/��ˏU8�C7A0`�6x����6ۗ#�b���Ħ�(��Sk̍�"|����9�" �G�`@LD���e�B�Q���� d��[q�Z�aځ��-j�����Zk�}F4���l���y�T ��B��|���ҕ~/����a�+�7��Ai=W���1�

php yii yii2
4个回答
1
投票

我在这段特定代码中遇到的问题是我必须删除

<?php Pjax::begin(); ?>
<?php Pjax::end(); ?>
以及上面和网格视图列中的
'pjax'=>true
,这样它就可以工作我没有改变
actionDownload($id)
代码中的任何内容

编辑前(原来的错误代码) `......................................

<h3><?= Html::encode($this->title) ?></h3>

<p>
    <?= Html::a('Create Status', ['create'], ['class' => 'btn btn-success']) ?>
</p>
<?php Pjax::begin(); ?>  

<?php

$gridColumns = [
['class' => 'kartik\grid\SerialColumn'],
'id',
'message',
'permissions',
'created_by',
'created_at',
// 'updated_at',
// 'image_src_filename',
//'image_web_filename',

 ['attribute'=>'Download',
   'format'=>'raw',
    'value' => function ($data) {
        return
        Html::a('Download file', ['status/download','id'=>$data->id], ['class' => 'btn btn-primary']);
    }
    ],
];
?>
<?php
$export = ExportMenu::widget([
'dataProvider' => $dataProvider,
//'columns' => $gridColumns,
'fontAwesome' => true,
'exportConfig' => [
ExportMenu::FORMAT_HTML => false,
ExportMenu::FORMAT_TEXT => false,
ExportMenu::FORMAT_CSV => false,
ExportMenu::FORMAT_EXCEL => false,
ExportMenu::FORMAT_EXCEL_X => false,
],
]);
?>

<?php
echo GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => $gridColumns,
'containerOptions' => ['style' => 'overflow: auto'], // only set when $responsive = false
'toolbar' => [
$export
],
'pjax' => true,
'bordered' => true,
'striped' => true,
'responsive' => true,
'floatHeader' => true,
'panel' => [
'type' => GridView::TYPE_PRIMARY,
'heading' => 'Forms Uploaded by Clients.',
],
]);
?>

<?php Pjax::end(); ?></div>`

编辑后(原来的错误代码)

`

<h3><?= Html::encode($this->title) ?></h3>

<p>
    <?= Html::a('Create Status', ['create'], ['class' => 'btn btn-success']) ?>
</p>

<?php

$gridColumns = [
['class' => 'kartik\grid\SerialColumn'],
'id',
'message',
'permissions',
'created_by',
'created_at',
// 'updated_at',
// 'image_src_filename',
//'image_web_filename',

 ['attribute'=>'Download',
   'format'=>'raw',
    'value' => function ($data) {
        return
        Html::a('Download file', ['status/download','id'=>$data->id], ['class' => 'btn btn-primary']);
    }
    ],
];
?>
<?php
$export = ExportMenu::widget([
'dataProvider' => $dataProvider,
//'columns' => $gridColumns,
'fontAwesome' => true,
'exportConfig' => [
ExportMenu::FORMAT_HTML => false,
ExportMenu::FORMAT_TEXT => false,
ExportMenu::FORMAT_CSV => false,
ExportMenu::FORMAT_EXCEL => false,
ExportMenu::FORMAT_EXCEL_X => false,
],
]);
?>

<?php
echo GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => $gridColumns,
'containerOptions' => ['style' => 'overflow: auto'], // only set when $responsive = false
'toolbar' => [
$export
],
'bordered' => true,
'striped' => true,
'responsive' => true,
'floatHeader' => true,
'panel' => [
'type' => GridView::TYPE_PRIMARY,
'heading' => 'Forms Uploaded by Clients.',
],
]);
?>`

就这些了!!我发现了。


1
投票

只需添加

 ob_clean();

之前

return Yii::$app->response->SendFile($path,$download->image_src_filename);

。 ob_clean() 将清理您的输出并解决问题。 这对我有用。 谢谢


0
投票

看起来您需要标题。

尝试使用此代码:

public function actionDownload($id) {
    header("Content-type:application/pdf");

........

如果不起作用也尝试添加此标头

header("Content-Disposition:attachment;filename='filename.pdf'");

0
投票

尝试将

data-pjax="0"
添加到
<a>
标签。通过向链接添加
data-pjax="0"
,您将指示 PJAX 忽略此特定链接,从而允许浏览器将下载作为常规 HTTP 请求进行处理。

© www.soinside.com 2019 - 2024. All rights reserved.