Laravel 5.8流下载文件附件重定向而不是下载



我想我犯了一个错误,在我的Laravel控制器中没有看到。我有JSON数据,我想把它吐成CSV,然后在浏览器中下载该文件。

我向服务器提交了一个表单,其中包含POST数据的隐藏输入,运行数据查询,然后使用fputcsv((创建文件流回调,并返回Laravel stream Response。

我想流式下载它,而不是在服务器上写一个文件来下载。我知道使用ajax或blobs来实现这一点的技巧,但我觉得下载CSV文件的表单POST应该非常简单,我在做一些愚蠢的事情。如果我只返回原始数据,CSV字符串看起来是正确的,所以我不认为这是处理或数据本身的问题。

ExportController

protected function csvFileHeaders($filename) {
return array(
"Content-type" => "text/csv",
"Content-Disposition" => "attachment; filename=". $filename,
"Pragma" => "no-cache",
"Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
"Expires" => "0"
);
}
public function __invoke() {
$filename = 'report_'.$endpoint.'_'.date('d-m-Y-H:i:s').'.csv';
$headers = $this->csvFileHeaders($filename);
$data    = $rows->toArray();
$columns = collect(request()->input('params.columns'))->map(function($c) {
return $c['label'];
})->toArray();
$fields = collect(request()->input('params.columns'))->map(function($c) {
return $c['value'];
})->toArray();
$callback = function() use ($data, $fields, $columns) {
$file = fopen('php://output', 'rw');
fputcsv($file, $columns);
foreach($data as $d) {
// MAP values to columns OR empty strings if value is not present
fputcsv($file, collect($fields)->map(function($f) use ($d) {
if ( array_key_exists($f, $d) ) { return $d[$f]; }
return '';
})->toArray());
}
fclose($file);
};

return response()->stream($callback, $filename, $headers);
}

前端React POST表单

<form id="report-export-form" action={'/report/export'} method="POST">
<div dangerouslySetInnerHTML={{ __html: csrf_token }} />
{/* BECOMES */}
{/* <div><input type="hidden" name="_token" value="...token value..."></div> */}
<input type="hidden" name="mode" value={form.mode)} />
<input type="hidden" name="endpoint" value={endpoint} />
<button className="btn btn-success" type="submit">
Export to CSV
</button>
</form>

发生的不是文件下载而是页面重定向(刷新到原始页面(,并且没有下载任何文件。有人看到我犯了什么错误吗?

原来有一个Validator规则检查以静默方式失败,导致重定向。

修复验证并确保设置"内容类型"one_answers"内容处置"标头已成功下载附件。

故事的寓意——首先简单,不要剥夺自己的睡眠。

相关内容

  • 没有找到相关文章

最新更新