我有一個Laravel 5.4應用程序,其中經過身份驗證的用戶需要能夠從S3存儲下載私人文件。我已經設置了一個路由和控制器來允許私人文件下載。Laravel 5文件下載:流()或下載()
的代碼看起來是這樣的:
路線:
控制器:
public function download($fileName)
{
if (!$fileName || !Storage::exists($fileName)) {
abort(404);
}
return response()->stream(function() use ($fileName) {
$stream = Storage::readStream($fileName);
fpassthru($stream);
if (is_resource($stream)) {
fclose($stream);
}
}, 200, [
'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
'Content-Type' => Storage::mimeType($fileName),
'Content-Length' => Storage::size($fileName),
'Content-Disposition' => 'attachment; filename="' . basename($fileName) . '"',
'Pragma' => 'public',
]);
}
所有工作正常,但是當我定睛一看至Laravel docs,我發現,他們只是談論response()->download()
。
如果我實現了樣的反應,我的代碼是這樣的:
public function download($fileName)
{
if (!$fileName || !Storage::exists($fileName)) {
abort(404);
}
$file = Storage::get($fileName);
return response()->download($file, $fileName, [
'Content-Type' => Storage::mimeType($fileName),
]);
}
這兩個功能可以在API docs找到。
我的問題:什麼是首選方式,每種方式的優缺點是什麼?
從我迄今收集:
流:
- 不需要將整個文件加載到內存中
- 適合大文件
下載:
- 需要更少的代碼
謝謝! –
@ jones03請參閱此答案https://stackoverflow.com/a/24008078 – Qh0stM4N