带有错误URL生成的Laravel Storage Facade Asset()

时间:2018-11-22 13:31:08

标签: php laravel

我一直在从事我的项目,但无法获得有关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

...为什么?!?!?!?!?!?我不明白我错过了什么。

2 个答案:

答案 0 :(得分:1)

这是因为asset()将指向public文件夹。
通过创建从symbolic linkstorage的{​​{1}}并使用public,您仍然需要告诉laravel您希望访问哪个公开的文件夹/文件。

如果您是asset()链接symbolic storage \ app \ public`;

如果您从which will restructure the path tosymbolic linkstorage\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