laravel 中的存储说符号链接 - 没有这样的文件
Posted
技术标签:
【中文标题】laravel 中的存储说符号链接 - 没有这样的文件【英文标题】:Storage in laravel says symlink - no such file 【发布时间】:2018-05-04 16:47:15 【问题描述】:我在 public_html/app 文件夹中的共享主机上部署了 laravel 应用程序。这是公共文件夹中的所有内容。在 /../../files 我有其余的文件。当我做 php artisan storage:link in files 文件夹时,我的控制台说
[ErrorException]
symlink(): No such file or directory
在本地主机上,我将文件上传到 storage/uploads 文件夹。现在做什么?我尝试更改链接,但对我没有任何效果...
【问题讨论】:
为什么是storage
而不是 public/assets
?我确定有路径问题尝试另一种方式
css 和 js 文件我在公共场合,但我的意思是例如用户上传的图像在 storage/uploads/images/
改用storage_path()
我不明白
@Programmmereg,您要重命名public
文件夹吗?如果是这样,请尝试将其重命名为 public
【参考方案1】:
进入/public
目录并运行:
rm storage
进入 Laravel 根目录并运行:
php artisan storage:link
2018 年 5 月 1 日编辑
当将 laravel 项目移动/复制到其他文件夹时会出现此问题。
存储链接仍然存在,因此导致异常错误。 public/storage 文件夹存在并指向错误的位置,需要使用rm storage
命令删除。
之后在终端运行php artisan storage:link
,它将创建存储链接。
每次移动/复制/部署 laravel 时都需要这样做!
【讨论】:
另外,如果你使用 Laravel Orchid,你可能还需要rm public/orchid && ./artisan orchid:link
还要小心,如果您的部署脚本删除了存储符号链接然后失败,然后您再次运行它并且符号链接已被删除,您的部署脚本可能会在尝试删除已经消失的内容时抛出错误,并失败。小心那个边缘情况。
你拯救了我的一天..谢谢。【参考方案2】:
我在使用共享主机时遇到同样的错误,我的公共目录移动到 public_html 或不同的目录 喜欢 : 根名称“项目”中的项目目录 和根名称“public_html”中的公共目录
当通过 Artisan::call('storage:link'); 运行 artisan 命令时然后面对这个错误。
解决方案: 第一个需要在 app/Providers/AppServiceProvider 注册方法中绑定你的公共目录
$this->app->bind('path.public', function()
return base_path('../public_html');
);
现在运行命令它工作正常
【讨论】:
【参考方案3】:以防万一你在这里仍然没有答案。
我遇到了麻烦,因为我在本地进行了符号链接,然后将文件复制到服务器。为了使它工作,我做了以下工作:
$ cd path/to/laravel/root
// if public does not exist, first create it.
$ cd public
// if public/storage does not exist, first create it.
$ rm -r storage
$ cd ..
// Now it should work
$ php artisan storage:link
【讨论】:
这很有名,创建一个目录来删除它,好主意!【参考方案4】:这通常发生在将 Laravel 应用移动到另一个目录之后
实际存储目录为“/AppName/storage/app/public/”
Laravel 创建一个指向实际存储目录“/AppName/public/storage”的符号链接
其他含义
"/AppName/public/storage" 指向 => "/AppName/storage/app/public/"
在将根应用程序目录更改为“/AnotherAppName/”时,符号链接仍将指向旧路径
"/AnotherAppName/public/storage" => "/AppName/storage/app/public/"
我的解决方案是使用手动更新符号链接
ln -sfn /AnotherAppName/storage/app/public/ /AnotherAppName/public/storage
【讨论】:
【参考方案5】:创建新的php文件并将这段代码放在文件中:
<?php
symlink('/home/CpanelUser/storage/app/public', '/home/CpanelUserpublic_html/storage');
?>
“CpanelUser”更改为您的 cpanel 用户名或主机名。
将此文件上传到网站的 public_html 文件夹 (www) 在浏览器中使用写入站点名称+此文件执行文件 完成!
示例: 我的文件名是 symlink.php,站点名称是 www.anysite.com 将 symlink.php 上传到主机中的 public_html 文件夹并在浏览器中获取网址
http://www.anysite.com/symlink.php
在 laravel 的 public 文件夹中执行此文件存储文件夹 creite 并链接到应用程序中的存储文件夹。
【讨论】:
【参考方案6】:任何将来使用 Laravel Forge 的人。我在 Forge 中重命名域名时遇到此错误。
解决方案是进入公共目录并删除已从原始域复制的现有符号链接。
删除此符号链接后,我能够再次运行php artisan storage:link
,并且运行正常。
【讨论】:
【参考方案7】:要在您的服务器上修复此错误,请将目录更改为公共目录并删除存储文件夹的符号链接。
以下命令将帮助您从公用文件夹中删除符号链接:
cd public
rm storage
删除符号链接更改目录到主文件夹后,使用:
cd ..
现在使用以下命令创建符号链接:
php artisan storage:link
成功运行命令后,您应该会收到以下消息
The [public/storage] directory has been linked.
希望这篇文章对你有所帮助。
SYMLINK(): No Such File or Directory Laravel
【讨论】:
【参考方案8】:遵循以下三个步骤:
-
从 public 文件夹中删除存储文件。
如果根目录中有存储文件夹,请删除应用文件夹中的公共文件。rm 公共/存储
运行链接命令rm 存储/应用程序/公共
php artisan storage:link
【讨论】:
删除storage/app/public
对我有用。【参考方案9】:
确保 .env
文件中的 APP_URL
配置设置正确。之后运行以下命令行:
php artisan config:cache
php artisan storage:link
【讨论】:
【参考方案10】:在我的情况下,转到符号链接部分中的 config/filesystem.php,我删除了 public_path 函数并在其中编写了自己的路径,然后再次运行 php artisan storage:link 命令。
'links' => [
'/var/www/storage' => storage_path('app/public'),
],
为我工作。
【讨论】:
【参考方案11】:如果问题尚未解决。 执行以下步骤:
-
从公用文件夹中删除存储链接或运行这些命令。
一)
cd 公开
b)rm storage
转到存储文件夹并检查是否app/public
文件夹存在,否则创建新文件夹。
检查错误是否已修复。
如果这些步骤不能解决您的问题,请删除 storage
文件夹并创建新的 storage
文件夹,其中包含所有必要的文件夹。
storage
文件夹包含:
app, framework,logs
app
包含:public
framework
包含:cache, data,sessions,testing, views
【讨论】:
【参考方案12】:我的问题是符号链接没有放在 /localhost/public/ 中,而是放在 /localhost/storage/app/ 中 当我删除 /localhost/storage/app/ 中的符号链接时,工匠命令就像一个魅力
在我的代码中我放置了这个以防止创建错误的符号链接
Route::get('/clear', function ()
Storage::deleteDirectory('public');
Storage::makeDirectory('public');
Artisan::call('route:clear');
Artisan::call('storage:link', [] );
);
【讨论】:
【参考方案13】:如果您使用共享主机或者您已将项目部署在具有 cPanel 或 DirectAdmin 的服务器上,您可能拥有一个 public_html
而不是 public
文件夹。
所以我们通常做的一件事是将 Laravel 的 public
文件夹更改为 public_html
。
然后我们转到我们的AppServiceProvider
并借助以下代码绑定新路径:
$this->app->bind('path.public', fn() => base_path('/public_html'));
但是您应该知道配置文件在您的提供程序的这些注册方法之前加载,因此您还必须在内核引导您的配置文件之前绑定它。
为此,请打开 index.php
并在定义的 $app
变量之后编写以下代码:
$app->bind('path.public', fn() => base_path('/public_html'));
我知道这可能看起来不是标准方式,但它工作得非常好,而且我还没有发现任何关键问题!
【讨论】:
【参考方案14】:我正在使用 Vagrant 并且遇到了同样的问题。我删除到public/storage
中的存储目录,但使用命令php artisan storage:link
时无法解决问题。
因此,我使用 ssh 连接到我的 vagrant box 并在那里运行命令。它有效,所以如果你正在运行 Vagrant 并且遇到同样的问题,这可能会有所帮助。
【讨论】:
【参考方案15】:删除现有的存储符号链接(public/storage
)然后运行
再次php artisan storage:link
命令。
【讨论】:
【参考方案16】:就我而言,我发现因为我已将所有 /public Laravel 文件移动到 public_html(在我的共享服务器上),所以 /public Laravel 目录不再存在。
创建一个新的“公共”目录后,我能够成功运行 'php artisan storage:link' 命令。
【讨论】:
【参考方案17】:在 web.php 中添加这个,然后点击这个 'BASE_URL/linkstorage
' URL 一次。
现在检查将在公用文件夹中创建存储文件夹。这将解决您的问题。
Route::get('/linkstorage', function ()
$targetFolder = base_path().'/storage/app/public';
$linkFolder = $_SERVER['DOCUMENT_ROOT'].'/storage';
symlink($targetFolder, $linkFolder);
);
【讨论】:
【参考方案18】:更多即时我改进@suresh-pangeni的答案
mv storage storage.bak // just for backup
mkdir -p storage/app/public,framework/cache,data,sessions,testing,views,logs
php artisan storage:link
现在它的工作
不要忘记
转到/public
目录并运行:
然后
rm storage
在运行上述命令之前。
☺ pa 存储:链接 生产 9999 ✗ [public/storage] 目录已链接。
【讨论】:
以上是关于laravel 中的存储说符号链接 - 没有这样的文件的主要内容,如果未能解决你的问题,请参考以下文章
在laravel 5.4(存储文件夹)中更改默认的“符号链接”文件夹
为啥我部署的 Laravel 8 应用程序无法通过符号链接在存储目录中找到图像?
图像不会上传到Laravel Project中的public_html文件夹