在我的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函数捕获它?
感谢您的帮助。