【发布时间】:2020-01-15 07:01:48
【问题描述】:
我正在尝试以 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);
};
//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');
}
【问题讨论】:
-
尝试将该行重命名
$file = fopen('output_chat.csv', 'w');为$file = fopen('php://output', 'w'); -
不打开实际文件,而是直接写入 PHP 输出缓冲区 - 参见 stackoverflow.com/a/16251849/10283047 的最后一部分(“更新”)
-
是的,它奏效了。 DL后自动删除原始数据?我对php输出缓冲区不是很熟悉。它安全吗?还是我必须手动删除某些内容?