Laravel应用程序的AWS Elastic Beanstalk部署上的符号链接的公共存储目录中的“无法加载PDF文档失败”(在本地工作)

时间:2018-12-08 23:47:48

标签: php laravel symlink amazon-elastic-beanstalk flysystem

我在使用我的应用程序已部署版本上的Laravel的Storage Facade检索下载在公共磁盘上存储的pdf文件时遇到了麻烦。它在本地可以正常工作。

这是从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文件,该文件利用弹性beantalk的post deploy钩子在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

(由于我缺乏Markdown技能,因此上述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();
    })
}

但是当打开文件时,我看到以下错误: Error Failed to load PDF document

在本地开发期间,由于没有在/ storage目录和/ public / storage目录之间创建符号链接,因此出现了同样的错误。创建该链接后,下载过程就成功了。

该符号链接似乎正在部署的实例上运行。当我进入它并导航到公共目录并列出内容时,我会看到以下内容:

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

从S3下载后,我看到pdf文件已添加到/ public / storage文件夹中。

我是否对弹性beantalk的目录结构有误解?还是符号链接?如何检索可公开访问的文件以供下载?

0 个答案:

没有答案