【问题标题】:Laravel storage returns FileNotFoundException But file existsLaravel 存储返回 FileNotFoundException 但文件存在
【发布时间】:2019-10-17 15:04:00
【问题描述】:

我想在 laravel 6 中读取文件内容,文件已经存在但 laravel 返回未找到异常。

这是我的日志文件目录: /var/www/html/myLaravelLab/storage/logs/laravel-2019-10-14.log

$contents = Storage::get(storage_path('logs/laravel-2019-10-14.log'));

Laravel 返回此错误:Illuminate\Contracts\Filesystem\FileNotFoundException

但是文件已经存在!

我想读取文件内容。


Laravel 版本:6.2.0 - PHP版本:7.2.19

【问题讨论】:

  • 你能dd(storage_path('logs/laravel-2019-10-14.log'))看看实际路径吗?否则可能是权限问题?
  • 我看到了这个结果:“/var/www/html/myLaravelLab/storage/logs/laravel-2019-10-14.log”我授予所有文件夹和文件的权限 777 .. . 但是还是看到那个错误!!!

标签: php laravel laravel-filesystem laravel-6.2


【解决方案1】:

config/filesystems.php添加新磁盘logs:

'disks' => [
        'logs' => [
            'driver' => 'local',
            'root' => storage_path('logs'),
        ],
// orher disks...

现在你可以获取日志文件了:

Storage::disk('logs')->get('laravel-2019-10-14.log');

【讨论】:

    【解决方案2】:

    storage_path('logs/laravel-2019-10-14.log') 将返回资源的完整路径,例如: http://www.app-name.com/storage/logs/laravel-2019-10-14.log.

    Storage::get() 接受相对于存储磁盘根目录的路径

    您可能不需要在函数中包含storage_path,并尝试以下操作:

    Storage::get('logs/laravel-2019-10-14.log')
    

    查看磁盘在哪里搜索文件,然后调整路径,直到搜索到正确的目录。

    【讨论】:

    • 我这样做了,但仍然返回错误! Illuminate\Contracts\Filesystem\FileNotFoundException
    【解决方案3】:

    storage_path 本质上会在你给它的路径前加上存储文件夹的路径,所以/var/www/website.com/storage/logs/laravel-2019-10-14.log

    如果您使用 Storage::path(),则其工作方式类似,但来自配置的存储磁盘(因此,如果您愿意,这可以是基于云的)。主要区别在于这看起来是 storage/app,所以您需要将您的日志移到那里,或者您可能会说:

    $contents = Storage::get('../logs/laravel-2019-10-14.log');
    

    $contents = file_get_contents(storage_path('logs/laravel-2019-10-14.log'));
    

    编辑:

    我刚刚检查过,您不能使用 Storage::get('../'),因为它超出了可用范围。如果您想使用Storage::get() 方法,您需要在配置中调整位置。 在config/filesystems.php

    'disks' => [
    
        'local' => [
            'driver' => 'local',
            // 'root' => storage_path('app'),
            'root' => storage_path(),
        ],
    ]
    
    

    那么你可以使用

    $contents = Storage::get('logs/laravel-2019-10-14.log');
    

    【讨论】:

    • php $contents = file_get_contents(storage_path('logs/laravel-2019-10-14.log')); 工作正常...
    • 这样的更改可能会导致应用程序的其他地方出现故障。最好新建一个单独的磁盘。
    • 这是真的!如果它不是一个全新的应用程序,最好创建一个新磁盘。 (可能最好以任何一种方式创建一个新的)
    【解决方案4】:

    也许 Storage 类对于您的实现来说太过分了。您可以改用 PHP file_get_contents() 函数:

    $contents=file_get_contents( storage_path( 'logs/laravel-2019-10-14.log' ) );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      相关资源
      最近更新 更多