【问题标题】:mkdir(): Permission denied Laravelmkdir(): 权限被拒绝 Laravel
【发布时间】:2015-12-03 06:36:40
【问题描述】:

我正在为服务器中的图像上传运行以下脚本,并在本地主机上完美运行时收到以下错误。

代码

$user_id = Auth::id();
$logicpath = 'userdp/' . $user_id . '/';
$pubpath = 'userdp/' . $user_id . '/' . $dpFile;
$path = '/userdp/' . $user_id . '/' . $dpFile;

if (!file_exists($logicpath)) {
     mkdir($logicpath, 0777, true);
}

错误

UploadController.php 第 605 行中的 ErrorException:mkdir(): Permission 拒绝

在 HandleExceptions->handleError('2', 'mkdir(): Permission denied', '/var/www/html/laravel/app/Http/Controllers/UploadController.php', '605', 数组('dp' => object(UploadedFile), 'ext' => 'jpg', 'img' => 对象(图像),'mime' => 'image/jpeg','width' => '200','height' => '200', 'fileSize' => '17152', 'dpFile' => 'f12f298ab18d58a59c4ed8a589cd1cdc.jpg', 'user_id' => '1', 'logicpath' => 'userdp/1/', 'pubpath' => 'userdp/1/f12f298ab18d58a59c4ed8a589cd1cdc.jpg', '路径' => '/userdp/1/f12f298ab18d58a59c4ed8a589cd1cdc.jpg'))

我尝试了chmod 777 public 并重新启动了服务器。但它没有用。

【问题讨论】:

  • 你应该使用 755 而不是 777。
  • 永远不要向您的根文件夹授予 777 权限。它对职业黑客的安全漏洞。请尝试绑定严格的安全规则,并仅将所需的权限/权限分配给组/用户。

标签: php laravel


【解决方案1】:

要解决这个问题,进入你的 laravel 项目,让你的公共目录可写。

sudo chmod -R 755 public

【讨论】:

    【解决方案2】:

    请不要将模式更改为 777,因为这可能会导致一些严重的安全问题。而是尝试使用这些命令来更改文件夹的权限。

    sudo chown -R www-data:www-data /var/www
    sudo chown -R $USER:$USER /var/www
    chmod -R 755 </userdp> Your upload folder path
    

    尝试上传 - 它会起作用 - 万一失败尝试

    $user_id = Auth::id();
    $logicpath = '/userdp/' . $user_id . '/';
    $pubpath = 'userdp/' . $user_id . '/' . $dpFile;
    $path = '/userdp/' . $user_id . '/' . $dpFile;
    
    if (!file_exists($logicpath)) {
         mkdir($logicpath, 0755, true);
    }
    

    【讨论】:

      【解决方案3】:

      您必须递归执行 chmod 以确保所有子目录也具有相同的权限。尝试运行它:

      chmod -R 777 
      

      现在虽然这将解决您的问题,但您绝对应该阅读设置上述权限时出现的问题,如下面的 cmets 中发布的此链接所示。我也在这里发帖:

      http://*.com/a/11271632/2790481

      编辑:这只能在 /var/www/html/laravel/storage 内的 Laravel 存储目录中完成,例如,永远不要在系统级别完成。我最初忘记提及这一点,因此所有的反对票。

      【讨论】:

      • 这可能会破坏您的整个系统
      • 此命令使整个服务器易受攻击。请不要使用此命令。
      • 您的代码在授予 777 权限后肯定会工作,但它会使服务器容易受到攻击。
      【解决方案4】:

      错误:

        [ErrorException]            
        mkdir(): Permission denied 
      

      如果您在/WWW 文件夹中创建项目并且遇到上述错误,请尝试使用以下命令,它对我有用。

      sudo chown -R www-data:www-data /var/www
      
      sudo chown -R $USER:$USER /var/www
      

      运行后,再次尝试创建项目。

      cd /var/www
      
      composer create-project laravel/laravel projectname "5.6.*"
      

      因为我使用的是 laravel 5.6,所以我在创建项目时指定了版本。

      【讨论】:

      • sudo chown -R www-data:www-data /var/www 为我工作!谢谢!
      【解决方案5】:

      运行chmod -R 777 可能无法正常工作,出于安全原因不应使用,这一直是一个警告。

      => 正如@bokino12 所说,这对你有用

      sudo chown -R www-data:www-data /var/www/yoursite/public

      =>如果由于某种原因它不起作用,那可能是当前用户没有目录权限,请尝试

      sudo chown -R $USER:$USER /var/www/yoursite/public

      这会将当前用户指定为目录的所有者。

      【讨论】:

        【解决方案6】:

        我找到了一个非常有趣的解决方案来解决这个问题。只需输入“。”像这个例子一样签名。这个对我有用。

        $destinationPath = "./public/uploads"; // upload path
            if (!file_exists($destinationPath)) {
              mkdir($destinationPath, 0755, true);
            }
            $request->sub_category_attr_value->move($destinationPath, $picName);
        

        【讨论】:

          【解决方案7】:

          试试:

          sudo chown -R www-data:www-data /var/www/yoursite/public
          

          【讨论】:

            【解决方案8】:

            您正在尝试将上传的文件移动到服务器根目录中的文件夹。确保获得正确的绝对路径。

            $logicpath = public_path() . '/userdp/' . $user_id . '/';
            

            【讨论】:

            • 你还需要递归地修改userdpchmod -R 755 public/userdp
            【解决方案9】:

            我尝试了 chmod 777 public 并重新启动了服务器。但它没有用。

            确保您以递归方式使用 CHMOD 并具有管理员权限(如果可以)

            SUDO CHMOD -R 777 /var/www/html/laravel/
            

            问候

            【讨论】:

            • 此命令使整个服务器易受攻击。请不要使用此命令。