【问题标题】:Laravel storage link won't work on productionLaravel 存储链接不适用于生产
【发布时间】:2018-11-16 17:08:57
【问题描述】:

我正在使用storage_path 来保存我的图像,并将我的存储文件夹符号化到public_html

php artisan storage:link

在本地一切正常,当我上传图像时,它会上传到存储文件夹中,并且它的链接会出现在public 文件夹中,但是由于我切换到实时主机和生产模式,我的图像将上传到存储文件夹中,但是我的public_html/storage 中没有任何内容,而且我无法将它们放入我的前端。

代码

/config/filesystems.php

'public' => [
  'driver' => 'local',
  'root' => storage_path('app/public/'),
  'url' => env('APP_URL').'/storage',
  'visibility' => 'public',
],

.env

FILESYSTEM_DRIVER=public

controller sample

if ($request->hasFile('image')) {
  $image = $request->file('image');
  $filename = 'page' . '-' . time() . '.' . $image->getClientOriginalExtension();
  $location = storage_path('app/public/images/' . $filename);
  Image::make($image)->resize(1200, 600)->save($location);
  if(!empty($page->image)){
    Storage::delete('images/' . $page->image);
  }
  $page->image = $filename;            
}

有什么想法吗?

【问题讨论】:

  • 您使用的不是public 目录,而是public_html。我不喜欢这种策略。在public_html 中创建一个公共目录并将url 设置为env('APP_URL').'/public/storage'。
  • 你需要在服务器上重新创建符号链接,它不会随之传输
  • @Ohgodwhy 抱歉,但我很困惑,1)Make a public directory in public_html 我的public_html 中确实有文件夹,它是在我运行 artisan 命令时创建的,2)我做了 'url' => env('APP_URL').'/public/storage', 但没有任何改变我无法获取我的图像
  • @ATechGuy 我该怎么做?我的主机中没有终端(不确定!)
  • 你确定你应该使用$image->getClientOriginalExtension();吗?这将允许我在您的服务器上存储一个 .php 文件并执行其中的任何代码。

标签: php laravel


【解决方案1】:

通过 public_path 更改 storage_path 设置

'public' => [
  'driver' => 'local',
  'root' => public_path('app/public_html/'),
  'url' => env('APP_URL').'/storage',
  'visibility' => 'public',
],

if ($request->hasFile('image')) {
  $image = $request->file('image');
  $filename = 'page' . '-' . time() . '.' . $image->getClientOriginalExtension();
  $location = public_path('app/public_html/images/' . $filename);
  Image::make($image)->resize(1200, 600)->save($location);
  if(!empty($page->image)){
    Storage::delete('images/' . $page->image);
  }
  $page->image = $filename;            
}

如果还是不行,你可以试试:

$path = base_path().'/../public_html/images'; 

【讨论】:

  • 这是您放置资产的同一个 /public 目录,还是只是 /storage 中的一个魔术文件夹?
【解决方案2】:

已解决

感谢您的帮助,我尝试在我的服务器上运行php artisan storage:link,但我发现我的服务器出于安全原因禁用了symlink。

所以我已将所有图片上传功能更改为将图片上传到我的public 文件夹而不是storage 文件夹,现在一切正常。

【讨论】:

  • 不推荐上传到公共,也不是标准的 Laravel 约定。
  • @ahinkle 上传到公众没有任何问题,如果您的观点是其他人可以在他们的 url 中加载您的资产并使用您的资源,您始终可以使用您的代码限制来自其他来源的资产访问或者在 cloudflare 链接保护的帮助下。
  • “存储”是有原因的。这是laravel存储系统。鉴于,为什么另一个答案比您选择的答案有更多的赞成票。
  • 是的,这取决于我们使用的托管/服务器限制,也不是我们手中的所有东西 + 没有人在寻求支持,我们在这里寻求解决方案。祝你好运
  • @ahinkle 当我们由于某种原因不能使用符号链接时,你建议怎么做?
【解决方案3】:

从公共中删除文件夹存储并在 cron 作业中运行此命令(一次):

ln -s /home/public_html/storage/app/public /home/dev5/public_html/public/storage

【讨论】:

    【解决方案4】:

    解决方案: 一旦您的应用程序上传到实时服务器。 只需检查公共目录中是否有任何存储文件夹。 Check the folder stucture

    只需从公共目录中删除存储文件夹即可。

    [app/public/storage]
    

    之后,从 putty 软件访问您的 Laravel 项目主文件夹,并实时运行此命令。

    记得配置你的 .env 文件 APP_URL={your live server ip} 然后下面的命令。

    php artisan storage:link
    

    它将在与 APP_URL 关联的公共文件夹中创建一个新的存储链接。

    【讨论】:

      【解决方案5】:

      我刚遇到这个问题,我就是这样解决的,不需要通过 SSH 连接到服务器或运行 CronJob:

      适用于 Laravel 5+(未测试过低版本)

      您可以在路由/控制器中使用Artisan::call() 方法来执行工匠命令,而无需使用终端。

      $exitCode = Artisan::call('storage:link', [] );
      echo $exitCode; // 0 exit code for no errors.
      

      【讨论】:

      • 你救了我的项目人......谢谢
      【解决方案6】:

      您也可以先删除您的文件夹 storage:link 然后在主机中打开终端并命令 php artisan storage:link 。如果您的托管支持符号链接,它将起作用

      【讨论】:

        【解决方案7】:

        我看到问题已得到解答,但我想提出另一个我认为很容易的解决方案。 进入路由文件夹your-app-folder/routes/web.php,注册新路由如下

        Route::get('/linkstorage', function () {
            Artisan::call('storage:link');
        });
        

        然后转到您的网站www.example.com/linkstorage,它会将您带到一个空白页面。 而已。将创建存储文件夹。我希望它可以帮助某人。

        【讨论】:

        • 这个最简单,不需要编辑路径(在许多环境中可能会有所不同)。每次迁移到生产服务器,只需要调用这个即可。
        • 太棒了!!我不知道为什么这不在 Laravel 官方文档中……我想……谢谢。
        • 对我也有用.. 协议错误
        • @iiiml0sto1 您也可以在您的公共目录中创建一个文件(例如symlink.php)并添加以下代码行<?php symlink('/home/your-host-namespace/public_html/your-app-folder/storage/app/public', '/home/your-host-namespace/public_html/storage');您也可以根据您目录的位置调整代码.完成后,访问 www.your-domain.com/symlink.php,这应该可以解决问题。
        【解决方案8】:

        解决方案是将文件和图像直接上传到 public_html 文件夹。 像这样更改 config/filesystems.php:

        'public' => [
            'driver' => 'local',
            'root' => public_path() . '/../public_html/admin-upload',
            'url' => env('APP_URL').'/admin-upload',
            'visibility' => 'public',
        ],
        

        【讨论】:

          【解决方案9】:

          从公共目录中删除存储文件夹 然后使用这条路线

          Route::get("/storage-link", function () {
              $targetFolder = storage_path("app/public");
              $linkFolder = $_SERVER['DOCUMENT_ROOT'] . '/storage';
              symlink($targetFolder, $linkFolder);
          });
          

          【讨论】:

            【解决方案10】:

            我知道这是一个旧线程,但我们可以通过在 Config/filesystem.php 中稍作更改来更改它

            替换

            'links' => [
                    public_path('/storage') => storage_path('app/public'),
                ],
            

            与

            'links' => [
                    base_path('/public_html/storage') => storage_path('app/public'),
                ],
            

            您可以检查此存储库。我已经在里面实现了 https://github.com/ali-chaudhry/Laravel-7-Boilerplate-with-Spatie-uuid-Unishrp-filemanager-integeration

            【讨论】:

            • 是的,这适用于 bigrock 服务器 thx aklot man
            【解决方案11】:

            我做了什么来解决这个问题:

            1. 使用 ssh 进入项目文件夹
            2. 如果公用文件夹不存在,请创建它。如果已创建,请确保删除您在开发中创建的存储符号链接。
            3. 做php artisan storage:link
            4. 将创建的存储符号链接移动到 public_html 文件夹
            5. 完成。

            【讨论】:

            • 我尝试了很多解决方案。只有这个对我有用!!!
            • 我试图获取存储文件夹的 url。我的代码也适用于获取存储映像。但它不起作用。我应用了这个命令并检查了它是否正常工作。谢谢。
            【解决方案12】:

            我有同样的问题,为了解决它,我不得不删除已经创建的文件夹的存储,然后我重新启动命令。 PHP工匠存储:链接

            【讨论】:

              【解决方案13】:

              我有同样的问题。当您在服务器上开始生产时,必须再次初始化/运行命令 php artisan storage:link。确保您的虚拟主机提供 SSH 访问权限或使用带有

              的脚本文件
              Artisan::call('storage:link', []);
              

              否则命令。我正在使用 Laravel v8+ 和 Livewire。

              【讨论】:

                【解决方案14】:

                我在共享虚拟主机上遇到了这个问题,而且我也无法访问终端。 这是错误

                symlink(): 没有这样的文件或目录

                所以, 只需在我的根目录中创建一个名为“public”的文件夹(与 app、vendor、config、... 文件夹相同的地址)

                然后我做到了:

                    Artisan::call('storage:link');
                

                因为您在生产中将“public”文件夹的名称更改为“public_html”,并且没有“public”文件夹取决于 Laravel 8 上的默认配置 请记住将 config/filesystem 和 ... 上的所有配置设置为默认值。

                毕竟,如果创建了符号,您可以删除“public_html”并将“public”文件夹重命名为“public_html”! 就是这样

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-02-22
                  • 2016-11-14
                  • 2018-02-28
                  • 2013-11-08
                  • 2020-04-19
                  • 1970-01-01
                  相关资源
                  最近更新 更多