我在使用我的应用程序已部署版本上的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的目录结构有误解?还是符号链接?如何检索可公开访问的文件以供下载?