我一直在从事我的项目,但无法获得有关Laravel Storage的信息,特别是public class MyGlobalActionFilter : IActionFilter
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.Filters.OfType<SkipMyGlobalActionFilterAttribute>().Any())
{
return;
}
// etc
}
}
存储状态及其URL。
我通过visibility : public
保存上传的文件
据我了解,当我将此$filename = $file->store('mpmlimages', 'public');
放在$filename
帮助函数中时,便得到了文件URL。
在当前目录结构中,
asset()
如果失败
我使用projectroot_folder
|-- storage <-- this is actual storage, right?
| |--app
| |--public
| |--mpmlimages <-- this is file location
|--public
|--storage (symlink to storage\app\public) <-- it has shortcut icon.. I believe it's what laravel said simbolic link
,我得到了asset($filename)
在以下情况下有效
手动将上述URL更改为http://localhost:8000/mpmlimages/{GENERATED_FILENAME}.png
...为什么?!?!?!?!?!?我不明白我错过了什么。
答案 0 :(得分:1)
这是因为asset()
将指向public
文件夹。
通过创建从symbolic link
到storage
的{{1}}并使用public
,您仍然需要告诉laravel您希望访问哪个公开的文件夹/文件。
如果您是asset()
链接symbolic
storage \ app \ public`;
如果您从which will restructure the path to
到symbolic link
做storage\app\public\mpmlimages
,则可以保留为public\mpmlimages
我认为您的符号链接结构是
asset('mpmlimages/<your img>')
为了减少存储空间,您的符号链接应该是什么
root
|--public
| |--**S**storage (storage\app\public)
|
|--storage
|--app
|--public
|--mpmlimages
|--img1.png
|--img2.jpeg
|-- etc
传说:
S ->作为符号链接指示器
要实现此符号链接关系,请运行:
root
|--public
| |--**S**mpmlimages(storage\app\public\mpmlimages)
|
|--storage
|--app
|--public
|--mpmlimages
|--img1.png
|--img2.jpeg
|-- etc
然后,如果您的ln -s storage/app/public/mpmlimages public/mpmlimages
包含$filename
,则只需:
mpmlimages/<img>
答案 1 :(得分:1)
最简单的解决方案是在资产调用之前添加存储空间:
asset("storage/{$filename}")
通过这种方式,您不必创建任何符号链接(除了已有的链接之外)。
要回答原始问题:调用$file->store
将使用公用磁盘。如果检查配置文件,您会注意到公用磁盘的根目录是'root' => storage_path('app/public')
,这就是为什么文件位于storage/app/public
文件夹中的原因。
此外,作为客户端,您应该只能访问公用文件夹中的文件,因此,指向storage
的符号链接。这就是您不使用storage_path()
的原因,因为它将显示Web服务器结构,而不是提供客户端可以使用的URL。示例:
asset('storage/{$filename}')
产生https:/server.com/storage/file.png
storage_path($filename)
产生/var/www/server/storage/app/public/file.png