Как убедиться, что изображение было подано прямо в Laravel 5? - PullRequest
0 голосов
/ 06 ноября 2018

(Если какой-то редактор поможет мне лучше озаглавить этот вопрос, я буду более чем благодарен)

У меня есть контроллер, у которого есть метод, который обслуживает изображение PNG в хранилище, в основном он говорит:

public function background($id) {
    $campaign = Campaign::find($id);
    $file = Storage::get($campaign->background);
    return new Response($file, 200);
}

В маршрутах у меня есть:

Route::get('/campaign/background/{id}', 
    'CampaignController@background')->name('campaign.background');

Итак, если я вызываю маршрут внутри тега <img ...> HTML, он отлично работает:

<img src="{{ route('campaign.background', [id => 1]) }}" class="...">

Это даст мне фоновое изображение для класса Campaign с идентификатором 1

Теперь моя проблема в том, что когда я пытаюсь загрузить несколько imgs, как в карусели Bootstrap 4, у меня есть:

<div id="caro" class="carousel slide" data-ride="carousel">
    <div class="carousel-inner">
        <div class="carousel-item active">
            <img class="d-block w-100" src="{{ route('campaign.background', ['id' => '4']) }}?auto=yes" alt="First slide">
        </div>
        <div class="carousel-item">
            <img class="d-block w-100" src="{{ route('campaign.background', ['id' => '14']) }}?auto=yes" alt="Second slide">
        </div>
        <div class="carousel-item">
            <img class="d-block w-100" src="{{ route('campaign.background', ['id' => '2']) }}?auto=yes" alt="Third slide">
        </div>
    </div>
</div>

Только первое изображение (id 4) отображается правильно, id 14 и 2 иногда загружаются правильно, но в большинстве случаев это не так, они показывают только ALT.

Я думаю, что это должно быть что-то, связанное с кешем, если я перезагружаю страницу несколько раз, все imgs появляются.

Я использую Laravel 5.7, PHP 7.2.10, Apache 2.4.35 поверх Windows 10

1 Ответ

0 голосов
/ 08 ноября 2018

Может быть, отсутствуют некоторые заголовки, и браузер не знает, какой тип файла вы обслуживаете?

Вы можете попробовать это:

public function background($id) {
    $campaign = Campaign::find($id);
    return Storage::response($campaign->background);
}

Storage::response() должен автоматически установить Content-Type, Content-Disposition, размер и, возможно, некоторые другие, о которых я забыл. Эти заголовки помогут браузерам определить, какой контент был в ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...