在 Laravel 中下载后如何重定向?
Posted
技术标签:
【中文标题】在 Laravel 中下载后如何重定向?【英文标题】:How do I redirect after download in Laravel? 【发布时间】:2014-10-26 19:25:36 【问题描述】:我正在使用 maatwebsite/excel 库创建 excel 文件,然后下载我的文件。
在我的控制器中,我这样做:
public function todas()
$input = Input::all();
if(isset($input['todos'])&&($input['todos']!=0))
set_time_limit(0);
$datainicio = DB::table('tb_periodo')->where('cod', $input['todos'])->pluck('periodo_inicio');
$datafinal = DB::table('tb_periodo')->where('cod', $input['todos'])->pluck('periodo_fim');
$mes = DB::table('tb_periodo')->where('cod', $input['todos'])->pluck('mes_referencia');
$horarioQuery = $this->horario->with(array('funcionario', 'item_contabil'))
->whereBetween('data', array($datainicio, $datafinal))
->whereNull('deleted_at')
->orderBy('cod_funcionario')
->orderBy('data', 'ASC')
->get();
$horarios = reset($horarioQuery);
$count = count($horarios);
if($horarios==null)
return Redirect::route('relatorios.todas')->withErrors(['não existem marcações para este período']);
$funcionarios = $this->funcionario->all();
$datainicio = Carbon::createFromFormat('Y-m-d H:i:s', $datainicio);
$datafinal = Carbon::createFromFormat('Y-m-d H:i:s', $datafinal);
$nome = 'Marcações'.$mes.'-'.Carbon::now()->year;
$this->horario->allToExcel($nome, $horarios);
return View::make('relatorios.todashow', compact('funcionarios', 'datainicio', 'datafinal', 'horarios', 'count', 'nome'));
else
return Redirect::route('relatorios.todas')->withErrors(['Selecione um período!']);
这是我生成excel文件的功能:
public static function allToExcel($nome, $horarios)
Excel::create($nome , function ($excel) use ($horarios)
$excel->sheet('Marcações', function ($sheet) use ($horarios)
$sheet->row(1, array(
'Unidade',
'Nome',
'Função',
'Data',
'Hora Faturada',
'Hora Contratada',
'Horas Trabalhadas',
'Horas Extras',
'Tempo Exposicao',
'Atividade',
'Item Contabil',
'Observacoes'
));
$sheet->row(1, function($row)
$row->setBackground('#2A8005');
$row->setFontColor('#ffffff');
$row->setFontWeight('bold');
);
$i = 2;
foreach ($horarios as $horario)
if($horario->funcionario->funcao_qt != null)
$funcao = $horario->funcionario->funcao_qt;
else
$funcao = $horario->funcionario->funcao_a5;
$sheet->row($i, array(
$horario->unidade,
$horario->funcionario->nome,
$funcao,
$horario->data->format('d/m/Y'),
$horario->hora_faturada->format('H:i'),
$horario->hora_contratada,
$horario->getWorkedHours()->format('H:i'),
$horario->getExtraHours()->format('H:i'),
$horario->tempo_exposicao ?: "-",
$horario->atividade,
$horario->item_contabil->CTD_DESC01,
$horario->observacoes
));
if($i % 2 != 0)
$sheet->row($i, function($row)
$row->setBackground('#D1D1D1');
);
$i++;
);
)->download('xls');
但是在我下载 excel 文件后,我无法重定向到路线或视图,我也尝试使用:
路线:
Route::post('relatorios/todas', array('as' => 'relatorios.todas', 'after' => 'voltar', 'uses' => 'ReportsController@todas'));
过滤器:
Route::filter('voltar', function()
return Redirect::back()->with('message', '<p class="bg-success"><b>Relatório gerado com sucesso</b></p>');
);
但是还是不行,下载我的文件后有没有其他方法可以重定向?
【问题讨论】:
【参考方案1】:成功了
我放弃了使用 ajax,只是尝试了路由
Route::get('relatorios/exportar/cod', array('as' => 'relatorios.exportar', 'uses' => 'ReportsController@exportar'));
我的控制器
public function exportar($cod)
set_time_limit(0);
$datainicio = DB::table('tb_periodo')->where('cod', $cod)->pluck('periodo_inicio');
$datafinal = DB::table('tb_periodo')->where('cod', $cod)->pluck('periodo_fim');
$mes = DB::table('tb_periodo')->where('cod', $cod)->pluck('mes_referencia');
$horarioQuery = $this->horario->with(array('funcionario', 'item_contabil'))
->whereBetween('data', array($datainicio, $datafinal))
->whereNull('deleted_at')
->orderBy('cod_funcionario')
->orderBy('data', 'ASC')
->get();
$horarios = reset($horarioQuery);
$nome = 'Marcações'.$mes.'-'.Carbon::now()->year;
$this->horario->allToExcel($nome, $horarios);
查看:
link_to_route('relatorios.exportar', 'Exportar para excel', array($cod), array('class' => 'btn btn-success'))
这对我来说已经解决了,因为不要加载另一个页面并下载正确的文件。 谢谢帮忙!!
【讨论】:
我也有同样的问题,但无法理解你的答案,你能详细说明.. 这不是回答问题,只有你在同一页面有下载。【参考方案2】:这是不可能的。问题在于,如果您向用户浏览器发送下载指令,实际上您是在发送响应,而您只能发送一个响应。
您可以做的是,首先将您的用户重定向到“最终”页面,然后在该页面中开始下载。代码类似于:
Session::flash('download.in.the.next.request', 'filetodownload.pdf');
return Redirect::to('/whatever/page');
然后在您的新页面中,您将有一些选项:
html:[meta http-equiv="refresh" content="5;url=http://watever.com/create_csv.php"] javascript:location.href = 'http://watever.com/create_csv.php'; iframe: [iframe src="create_csv.php"][/iframe]因此您可以在布局中执行以下操作:
<html>
<head>
@if(Session::has('download.in.the.next.request'))
<meta http-equiv="refresh" content="5;url= Session::get('download.in.the.next.request') ">
@endif
<head>
<body>
...
</body>
</html>
另外,看看这个答案:PHP generate file for download then redirect
【讨论】:
我陷入了一个循环,我的布局总是重定向到下载文件。我无法取消设置(或不知道如何设置)下载网址以上是关于在 Laravel 中下载后如何重定向?的主要内容,如果未能解决你的问题,请参考以下文章