Laravel以CSV格式下载查询结果

时间:2019-09-13 11:41:07

标签: php html laravel download

我正在尝试以CSV格式下载查询,目前面临两个问题:

  1. 在公用文件夹中创建了一个文件。它包含查询数据。确实很糟糕,因为它不应存在于公用文件夹中。

  2. 还下载了一个文件,但下载的文件为空。

功能如下:

public function get_chatmessages(Request $data) {

    try {  
        if ($data->chat_to_user) {              
            $result = DB::connection('mysql_live')->table('user_chatmessages')
                ->where(function($query) use($data) {
                    $query->where('from_user', $data->chat_from_user)->where('to_user', $data->chat_to_user);
                })->orWhere(function($query) use($data) {
                    $query->where('to_user', $data->chat_from_user)->where('from_user', $data->chat_to_user);
                })->orderBy('date_added', 'asc')->get();
        } else {
            $result = DB::connection('mysql_live')->table('user_chatmessages')
            ->where('from_user', $data->chat_from_user)
            ->orWhere('to_user', $data->chat_from_user)
            ->orderBy('date_added', 'asc')
            ->get();
        }

        //\Log::info($data);
        //\Log::info($result);

        $headers = array(
            "Content-type" => "text/csv",
            "Content-Disposition" => "attachment; filename=file.csv",
            "Pragma" => "no-cache",
            "Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
            "Expires" => "0"
        );

        $columns = array('from_user', 'to_user', 'message', 'date_added');
        $callback = function() use ($result, $columns) {
            $file = fopen('output_chat.csv', 'w');
            fputcsv($file, $columns);

            foreach($result as $res) {
                fputcsv($file, array($res->from_user, $res->to_user, $res->message, $res->date_added));
            }
            fclose($file);
        };

        //return response()->download('output_chat.csv', 'DL_output_chat.csv', $headers);
        //return response()->make($callback, 200, $headers);
        return response()->stream($callback, 200, $headers);  

    } catch (\Exception $e) {  
        return redirect('home')->with('error', $e->getMessage());  
    } 

    return redirect('home')->with('error', 'Etwas ist schief gelaufen');  
}

4 个答案:

答案 0 :(得分:2)

我在function getList(): readonly number[] { return [1,2,3]; } const list = getList(); list[2] = 5; // <-- error

的代码段中所做的更改很少
php://output

答案 1 :(得分:0)

对于Laravel,有很多可以为我们提供此类实现的软件包。 并且,您可以使用Laravel Excel软件包来创建包含数据库记录的<a href="#content" class="force-reload">Click here</a> 下载文件。

此软件包具有许多有用的功能。尝试使用它。

答案 2 :(得分:0)

您可以决定文件的保存位置-您可以使用Laravel的Storage门面进行保存。

private function pathToPrivateStorage()
{
    return '/private/CSVs';
}

Storage::put($this->pathToPrivateStorage, $YOURCSVFILE);

您可以阅读有关存储here的更多信息。

答案 3 :(得分:0)

尝试用$file = fopen('php://output', 'w');代替$file = fopen('output_chat.csv', 'w');