Yii2 Ajax请求文件下载

时间:2017-05-04 12:59:29

标签: javascript php jquery ajax yii

在我的Yii2应用程序中,我动态生成.zip文件,我希望通过我的一个视图中的Ajax调用下载。

这是我的代码

_view.php

$js = <<<JS
    $('#button-download').on('click', function(){

        var tkn = $('meta[name="csrf-token"]').attr("content");
        var fields =  JSON.stringify($('#gridview').yiiGridView('getSelectedRows'));

        $.ajax({
            url: '$urlDownload', // Generated with Url::toRoute([someaction]);
            type: 'get',
            dataType: 'json',
            data: {
                field: fields,
                _csrf : tkn, 
            },
            success: function(data){
                console.log(data);
                // ?
                // ?
                // ?
            }
        });
    });
JS;

$this->registerJs($js);

这是我的视图文件,在这里我注册了$ .ajax方法,该方法在我的控制器中达到了一个动作。

Controller.php这样

/**
 * Download Action
 * 
 * @param integer $field
 * @return mixed
 */
public function actionDownload($field) {

    if (Yii::$app->request->isAjax && !empty(json_decode($field))) {

        // Bring some Data From Db

        // Create a new Zip
        $archive = new \ZipArchive();
        $now = $timestamp; // let's assume that the $now variable is a valid timestamp

        $zip_name = Yii::t('app', 'NameThisArchive').$now.'.zip';

        if (!$archive->open(Yii::getAlias('@app/runtime/foo').'/'.$zip_name, \ZipArchive::CREATE)) {
            throw new \Exception('Can\'t create the file');
        }

        foreach ($datafromdb as $record) {

            if ($somecondiction) {

                // Generating files and adding them to my archive

                $archive->addFile($path, '/'.Yii::t('app', 'somefileinpdf{0}.pdf', [$record->id]));
            }
        }
        $archive->close();

        // return ?
        // Yii::$app->response->sendFile($path, $zip_name);

    }
}

在此控制器中,我从ajax请求接收数据。我能够创建zip存档并将其保存到我的运行时文件夹中。

现在,问题是,如何将此文件发送到ajax调用。 (在.success()回调中)。

我该怎么回事?

在yii官方论坛上,我找到了一些回复助手:

Yii::$app->response->sendFile("path", "Filename");

如果我返回该函数return Yii::$app->response->sendFile("path", "Filename");

我的浏览器中没有下载文件。 但是在我的Safari浏览器控制台中,我看到xhr请求(我用ajax发送的请求)会返回一些数据。

所以给出了回应。 如何使用我的Ajax函数捕获它?

感谢您的帮助。

0 个答案:

没有答案