为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel 将查询结果下载为 CSV

Laravel 将查询结果下载为 CSV

PHP
叮当猫咪 2022-01-08 20:17:52
我正在尝试以 CSV 格式下载查询,目前面临两个问题:在公用文件夹中创建一个文件。它包含查询数据。这真的很糟糕,因为它不应该存在于公用文件夹中。还下载了一个文件,但下载的文件是空的。这是功能: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);        };    } catch (\Exception $e) {          return redirect('home')->with('error', $e->getMessage());      }     return redirect('home')->with('error', 'Etwas ist schief gelaufen');  }
查看完整描述

3 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

我在你的片段中做了一些关于 php://output


$headers = [

    "Content-type"        => "text/csv",

    "Content-Disposition" => "attachment; filename=output_chat.csv", // <- name of file

    "Pragma"              => "no-cache",

    "Cache-Control"       => "must-revalidate, post-check=0, pre-check=0",

    "Expires"             => "0",

];

$columns  = ['from_user', 'to_user', 'message', 'date_added'];

$callback = function () use ($result, $columns) {

    $file = fopen('php://output', 'w'); //<-here. name of file is written in headers

    fputcsv($file, $columns);

    foreach ($result as $res) {

        fputcsv($file, [$res->from_user, $res->to_user, $res->message, $res->date_added]);

    }

    fclose($file);

};


查看完整回答
反对 回复 2022-01-08
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

你可以决定保存文件的位置——你可以使用 Laravel 的 Storage 外观来做到这一点。


private function pathToPrivateStorage()

{

    return '/private/CSVs';

}


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

您可以在此处阅读有关存储的更多信息。


查看完整回答
反对 回复 2022-01-08
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

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


查看完整回答
反对 回复 2022-01-08
  • 3 回答
  • 0 关注
  • 254 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信