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

问题描述

我认为我犯了一个我在Laravel控制器中没有看到的错误。我有要插入CSV的JSON数据,然后在浏览器中下载该文件。

我正在提交带有隐藏输入的表单,用于将POST数据发送到服务器,运行对数据的查询,然后使用fputcsv()创建文件流回调,并返回Laravel流响应。

我想流式下载它,而不是在服务器上写入文件以进行下载。我知道使用ajax或blob代替它的技巧,但是我觉得下载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规则检查无提示失败,从而导致了重定向。

修正验证,并确保设置Content-Type和Content-Disposition标头已成功下载附件。

道德故事-首先简单就睡不着会剥夺自己。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...