«Не удалось загрузить документ PDF» из общедоступного каталога с символическими ссылками в AWS Elastic Beanstalk при развертывании приложения Laravel (работает локально) - PullRequest
0 голосов
/ 09 декабря 2018

У меня проблемы с получением файла PDF, хранящегося на общедоступном диске, с использованием фасада хранилища Laravel в развернутой версии моего приложения.Локально работает как положено.

Вот функция, которая извлекает файл из S3, затем сохраняет его на диск, а затем возвращает ответ о загрузке файла.

public function downloadAddendum($id)
{    
    $addendum = Addendum::find($id);
    $path = Storage::disk('s3')->url($addendum->filename);
    $file = file_get_contents($path);
    Storage::disk('public')->put($addendum->filename, $file);
    return response()->download(storage_path("app/public/{$addendum->filename}"))->deleteFileAfterSend();
}

Для того, чтобы сделатьЛокально хранящиеся файлы, общедоступные. Я создал символическую ссылку, как описано в документации Laravel.Локально я запускаю команду php artisan storage:link.Для развертывания у меня есть файл .ebextension / 01_deploy.config, в котором используется хук post-deploy гибкого beanstalk для создания символической ссылки в каталоге var / app / current.

files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/99_symlink_public_storage.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
        #!/usr/bin/env bash
        sudo php /var/app/current/artisan storage:link

(пробел отключен наприведенный выше блок кода yml, так как мне не хватает навыков уценки. Фактический файл расположен правильно)

В развернутой среде, когда пользователь нажимает кнопку загрузки, загружается файл PDF.Вот javascript.

handleDownload(id) {
    axios({
        url: '/api/download/addendum/' + id,
        method: 'GET',
        responseType: 'blob',
    }).then((response) => {
        const url = window.URL.createObjectURL(new Blob([response.data]));
        const link = document.createElement('a');
        link.href = url;
        link.setAttribute('download', 'addendum.pdf');
        document.body.appendChild(link);
        link.click();
    })
}

Но при открытии файла я вижу следующую ошибку: Ошибка при загрузке PDF-документа

Во время локальной разработки я получилэта же ошибка, потому что я еще не создал символическую ссылку между каталогом / storage и каталогом / public / storage.Когда я создал эту ссылку, процесс загрузки прошел успешно.

Символическая ссылка работает на развернутом экземпляре.Когда я захожу в него по ssh и перехожу в публичный каталог и перечисляю содержимое, я вижу это:

storage -> /var/app/current/storage/app/public

И я вижу файлы pdf, добавленные в папку / public / storage после того, как онизагружаются с S3.

Неужели я что-то неправильно понимаю в структуре каталогов эластичного бобового стебля?Или символические ссылки?Как я могу получить общедоступный файл для скачивания?

...