【问题标题】:Laravel download query results as CSV [duplicate]Laravel 将查询结果下载为 CSV [重复]
【发布时间】:2020-01-15 07:01:48
【问题描述】:

我正在尝试以 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');  
}

【问题讨论】:

  • 尝试将该行重命名 $file = fopen('output_chat.csv', 'w');$file = fopen('php://output', 'w');
  • 不打开实际文件,而是直接写入 PHP 输出缓冲区 - 参见 stackoverflow.com/a/16251849/10283047 的最后一部分(“更新”)
  • 是的,它奏效了。 DL后自动删除原始数据?我对php输出缓冲区不是很熟悉。它安全吗?还是我必须手动删除某些内容?

标签: php html laravel download


【解决方案1】:

关于php://output,我对你的sn-p 做了一些改动

$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);
};

【讨论】:

  • 是的,它奏效了。 DL后自动删除原始数据?我对php输出缓冲区不是很熟悉。它安全吗?还是我必须手动删除某些内容?
  • 为了安全使用存储文件夹,laravel 无论如何都不会授予对该文件夹的访问权限。但是在代码中,你可以(当然你想要那个)。公用文件夹不安全,因为可以通过 URL 访问。
  • 但我们现在使用输出缓冲区。它的位置在哪里?所以我应该写入存储而不是输出缓冲区?
  • 您希望将其存储在内部,而不是将其下载给最终用户,对吧?
  • 我不想存储。我想下载它,就是这样。服务器上应该没有文件的痕迹。
【解决方案2】:

对于 Laravel,有许多包为我们提供了这样的实现。 为了让您使用您的数据库记录创建下载csv 文件,您可以使用Laravel Excel 包。

这个包有很多有用的功能。尝试使用它。

【讨论】:

    【解决方案3】:

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

    private function pathToPrivateStorage()
    {
        return '/private/CSVs';
    }
    
    Storage::put($this->pathToPrivateStorage, $YOURCSVFILE);
    

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-13
        • 1970-01-01
        • 1970-01-01
        • 2015-10-30
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 2021-05-22
        相关资源
        最近更新 更多