Генерация PDF с динамическим изображением из киосков хранения в Laravel

У меня проблема с представлением и созданным контентом для создания PDF-файла. В настоящий момент я работаю с niklasravnsborg \ LaravelPdf (оболочкой для mPDF из-за проблемы с другим писателем PDF, с которым я работал раньше), который дает хорошие PDF-файлы того качества, которое я хочу.

У меня никогда раньше не было проблем с изображениями внутри представления с этим средством записи PDF, но я должен признать, что они были с изображениями, которые уже были настроены внутри представления (например, логотип, а не фотография сотрудников) .

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

С моего контроллера я получаю следующее:

$employeeMedCert = $employee->attachments()->where('category','Medical Examiners Certificate')->orderBy('endDate','desc')->limit(1)->get();

И тогда в моем клинке есть следующее:

@foreach($employeeMedCert as $med){
    {{Storage::url($med->attachment)}}
 @endforeach

Теперь, с этой текущей настройкой, я без каких-либо проблем получаю общедоступный путь к прикреплению.

тем не мение, если я сделаю следующее:

@foreach($employeeMedCert as $med){
    <img src = "{{Storage::url($med->attachment)}}">
@endforeach

Это останавливает мой Laravel до такой степени, что мне нужно перезагрузить сервер, а я ничего не сгенерировал.

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

Загрузить действие контроллера:

        $path = Storage::putFile('public/employees', new File(request('file')));

        employeeAttachment::create([
                        'attachment' => $path,
                        'attachmentType' => Storage::mimeType($path),
                        'category' => $request->type,
                        'endDate' => $request->dueDate,
                        'date' => $request->date,
                        'employeeID' => $employee,
                        'createdBy' =>  Auth::id()
                    ]);      
@enforeach должен быть @endforeach. Может быть причиной вашей проблемы с замкнутым циклом.
hdifen 21.05.2018 19:45

@hdifen - К сожалению, это была опечатка в этом посте. Хотя было бы неплохо, если бы это было так.

Matthew 21.05.2018 20:05

Я предполагаю, что Storage::url() ожидает одну строку, и кажется, что вы передаете объект. Вы пробовали {{Storage::url($med->attachment->url)}}?

hdifen 21.05.2018 20:26

@hdifen - См. мои изменения внизу. Это то, о чем вы имели в виду? Потому что, к сожалению, это тоже привело к проблеме ...

Matthew 21.05.2018 20:30

Ваше соглашение об именах меня немного смутило, так что это не будет вашей проблемой. Я подумаю

hdifen 21.05.2018 20:35

Ваши файлы общедоступны?

hdifen 21.05.2018 20:42

@hdifen - Да, я использую это конкретное вложение в паре других мест в моем проекте без каких-либо ошибок разрешений / путей.

Matthew 21.05.2018 20:43

Еще одно напоминание, Мэтью, что мы предпочитаем технический стиль письма. Мы мягко не приветствуем приветствия, надеемся, что вы можете помочь, спасибо, заранее спасибо, благодарственные письма, приветы, добрые пожелания, подписи, пожалуйста, не могли бы вы помочь, болтливый материал и сокращенный txtspk, мольбу, как долго вы застряли, советы по голосованию, мета-комментарии и т. д. Просто объясните свою проблему и покажите, что вы пробовали, чего вы ожидали и что на самом деле произошло.

halfer 22.05.2018 12:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
8
914
1

Ответы 1

Ключ к разгадке этой проблемы заключается в том, что в тегах html <img> выполняется запрос на получение, когда они запускаются в HTML. Это означает, что у вас может быть ошибка разрешения.

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

Следующие вещи необходимо проверить (при условии, что вы используете базовое хранилище, например, не используете AWS):

  1. Находится ли изображение в вашей общей папке или вы правильно создали символьную ссылку: https://laravel.com/docs/5.6/filesystem.
  2. Если ваши файлы общедоступны, можете ли вы перейти к ним в браузере?
  3. Вы пробовали использовать URL-адрес вместо того, чтобы проходить через хранилище? например <img src = "{{base_url() . $med->attachment)}}"> (при условии, что $med->attachment - это путь к файлу).

Предполагая, что это общедоступный файл, вам не нужно проходить фасад Storage, чтобы получить к нему доступ. Сообщите мне, если это укажет вам правильное направление.

Назначение фасада Storage - сохранять файлы, получать файлы и загружать их в переменную php. В настоящее время вы загружаете файл с сервера, а затем указываете свой тег изображения на файл, а не на URL-адрес, где хранится изображение.

Включение действительного URL-адреса в тег img должно решить вашу проблему (показано в 3 выше).

У меня есть все, кроме числа 3. Моя проблема (и, возможно, вы сможете направить меня в правильном направлении, заключается в том, что на данный момент возвращаемый путь прикрепления (только через $ med-> attachment) является "общедоступным / employee / lAwWqHfur0aLx071KRdaxEyhx4Hh60ktjziUBklk.j‌ peg "- это проблема, потому что для того, чтобы его можно было найти, у него должен быть URL-адрес" / storage / employee / .... "

Matthew 21.05.2018 21:01

Вы переписываете свой URL-адрес в .htaccess, чтобы не было «общедоступного»?

hdifen 21.05.2018 21:06

Я еще не касался этого, но ваш комментарий заставил меня задуматься - я фактически унаследовал этот проект и пытаюсь выполнить некоторые столь необходимые обновления, на данный момент, когда пользователь загружает какое-либо вложение, это процесс контроллера ниже , есть ли лучший способ справиться с этим в данном конкретном случае? (СМ. ВЫШЕ РЕДАКТИРОВАТЬ)

Matthew 21.05.2018 21:09

Вроде нормально. Можете ли вы пойти на dd(base_url() . $med->attachment); и проверить, можете ли вы перейти по этому URL-адресу в браузере? Вы должны увидеть изображение.

hdifen 21.05.2018 21:12

Куда бы вы хотели, чтобы я поместил это в контроллер, чтобы я мог получить результаты, которые вы ищете?

Matthew 21.05.2018 21:19

Да в контроллере было бы лучше всего. Я думаю, ваша проблема в том, что генерируемый URL-адрес неверен.

hdifen 21.05.2018 21:27

Я перешел в автономный режим, я обновил свой ответ выше, чтобы помочь вам встать на правильный путь. Дай мне знать, как у тебя дела.

hdifen 21.05.2018 21:32

В качестве обновления я обнаружил, что это должно быть что-то с самим тегом изображения. Мне пришлось изменить ваше предложение для ссылки на актив (чтобы получить общедоступный URL-адрес для доступа к месту хранения). У меня не было никаких проблем, это дало мне полную информацию: 192.168.1.178:8000/storage/employees/… - это точный способ доступа к файлу без каких-либо проблем. Но когда я помещаю его в <img src = "(url here)">, он снова ломает генератор PDF.

Matthew 21.05.2018 22:14

У вас такая же ошибка? Может быть, попробуйте жестко закодировать файл напрямую, например <img src = "/storage/employees/picture.jpg">.

hdifen 22.05.2018 03:35

Да, на этом этапе я жестко закодировал полный URL-путь в шаблоне лезвия, относительный путь в шаблон, но они продолжают нарушать работу генератора. Я попробовал использовать внешнее изображение, и оно мгновенно загрузилось в PDF. Так что я действительно не уверен, что происходит на данный момент ...

Matthew 22.05.2018 04:36

Другие вопросы по теме