Laravel: Как просмотреть этот файл S3 в браузере - PullRequest
1 голос
/ 13 марта 2019

Я могу заставить браузер показывать окно загрузки со следующим кодом:

return Storage::disk('private')->download("cv/{$id}.pdf");

Когда я пытаюсь отобразить его в браузере, используя следующий код, я получаю ошибку:

return response()->file(Storage::disk('private')->url("cv/{$id}.pdf"));

Сначала я подумал, что это связано с тем, что разрешения браузера применяются во втором случае (не на сервере, который имеет ключ AWS).Это, однако, не имеет смысла, поскольку ошибка является исключением «файл не найден» из Symphony.

URL-адрес, указанный в сообщении об ошибке, выглядит правильным.

1 Ответ

0 голосов
/ 21 июня 2019

У меня только что возникла та же проблема, и вот мое решение:

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');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...