4

目前在我的服务器上遇到问题,链接到我的 Laravel 应用程序中的文件。

我目前有一个images文件夹,并将storage/app/publicstorage/app/public文件夹链接到public.php artisan storage:link

现在我image.jpgimages文件夹中有一个。在我的本地系统上使用时,valet我可以看到带有以下链接的图像:

  1. /images/image.jpg
  2. /storage/images/image.jpg

在我的服务器上,只有第二个有效(我认为这是正确的,因为-directory中没有images直接文件夹。public

问题是,我在部署时经常遇到问题,因为客户无法在线看到图像(因为链接不起作用)。如果我在测试 UI 时看不到本地图像,这将不是问题。

任何人也有这个问题,可以引导我找到某种解决方案吗?

4

2 回答 2

4

问题是LaravelValetDriver有一个后备测试;如果公共目录中不存在该文件,则它将检查公共存储目录。

你可以在这里找到:

if ($this->isActualFile($storagePath = $sitePath.'/storage/app/public'.$storageUri)) {
    return $storagePath;
}

您可以通过创建自己的 Valet Driver来防止这种行为,该驱动程序扩展 LaravelValetDriver 并覆盖该isStaticFile方法,例如:

class NoStorageFallbackLaravelValetDriver extends LaravelValetDriver
{

    public function isStaticFile($sitePath, $siteName, $uri)
    {
        if (file_exists($staticFilePath = $sitePath. '/public' . $uri)
       && is_file($staticFilePath)) {
            return $staticFilePath;
        }

        return false;
    }
}
于 2018-04-09T15:52:50.480 回答
0

使用公共磁盘很简单,开箱即用应该没有问题。

公共磁盘使用“本地”驱动程序,默认情况下使用 storage/app 目录。


命令:

php artisan storage:link 

将在您的公用文件夹中创建一个符号链接“storage”,链接到非公用文件夹 storage/app/public。

当链接工作时,您可以使用以下命令:

Storage::disk('local')->put('public/file.txt', 'Contents');

这会将 file.txt 存储到

storage/app/public/file.txt 

您不会访问 storage/app/public.file.txt 中的文件,而是使用符号链接 public/storage... 访问它

因此,您保存的文件将在以下位置公开访问

public/storage/file.txt

使用资产助手可以获取文件的位置:

echo asset('file.txt');
于 2018-04-09T15:03:32.913 回答