web-dev-qa-db-ja.com

Laravel PHP出力バッファVS.プライベートストレージフォルダからファイルをダウンロード|セキュリティ

ユーザーはクエリ結果をCSV形式でダウンロードできます。ファイルは小さいですが(数KB)、内容は重要です。

最初のアプローチは、php出力バッファーを使用することですphp://

$callback = function() use ($result, $columns) {
    $file = fopen('php://output', '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()->stream($callback, 200, $headers);

2番目のアプローチは、laravelsストレージシステムに新しいフォルダーを作成し、それをプライベートに設定して、そこからファイルをダウンロードすることです。ダウンロード後にファイルを削除することもできます。

'csv' => [
    'driver' => 'local',
    'root' => storage_path('csv'),
    'visibility' => 'private',
],

作成/ダウンロードコードは次のとおりです。

$file = fopen('../storage/csv/file.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()->make(Storage::disk('csv')->get('file.csv'), 200, $headers);

このリターンにより、ダウンロード後にファイルが即座に削除されます。

return response()->download(Storage::disk('csv')->path('file.csv'))
->deleteFileAfterSend(true);

より安全なものは何ですか?より良いアプローチは何ですか?私は現在、ストレージに関する2番目のアプローチに傾いています。

12
Roman

最初のオプションだと思います

The first approach is to use php output buffer php://:

ファイルをどこにも保存しない場合よりも安全です。

0