У меня только что возникла та же проблема, и вот мое решение:
use Illuminate\Support\Facades\Storage;
$s3_filepath = 'path/to/file/on/s3.pdf';
$filename = 'example.pdf';
$temp_filepath = tempnam(sys_get_temp_dir(), '');
$file_data = Storage::disk('s3')->get($s3_filepath);
file_put_contents($temp_filepath, $file_data);
return response()
->download($temp_filepath, $filename, [], 'inline')
->deleteFileAfterSend();
Я использую это в Laravel 5.8, не знаю о более ранних версиях.
Это запоздалая мысль ...
Прочитав документы, https://laravel.com/docs/5.8/responses#response-macros,, если вам понадобится эта функция несколько раз, вы можете создать макрос ответа.Это также приведёт в порядок контроллер.Не проверено, но вот основы:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Response;
class ResponseMacroServiceProvider extends ServiceProvider
{
/**
* Register the application's response macros.
*
* @return void
*/
public function boot()
{
Response::macro('fileFromStorage', function ($disk, $filepath, $filename) {
$temp_filepath = tempnam(sys_get_temp_dir(), '');
$file_data = Storage::disk($disk)->get($filepath);
file_put_contents($temp_filepath, $file_data);
return response()
->download($temp_filepath, $filename, [], 'inline')
->deleteFileAfterSend();
});
}
}
... и затем в вашем контроллере:
public function viewFile()
{
return response()->fileFromStorage('s3', 'path/to/file.pdf', 'file.pdf');
}