创建目录:权限被拒绝 Laravel

9
我将为您翻译有关编程的中文内容。以下是需要翻译的内容:

我正在服务器上运行以下脚本进行图像上传,但在本地主机上完全正常工作时,出现以下错误。

代码

$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 denied

在HandleExceptions类中,处理错误信息为:('2', 'mkdir(): Permission denied', '/var/www/html/laravel/app/Http/Controllers/UploadController.php', '605', array('dp' => object(UploadedFile), 'ext' => 'jpg', 'img' => object(Image), 'mime' => 'image/jpeg', 'width' => '200', 'height' => '200', 'fileSize' => '17152', 'dpFile' => 'f12f298ab18d58a59c4ed8a589cd1cdc.jpg', 'user_id' => '1', 'logicpath' => 'userdp/1/', 'pubpath' => 'userdp/1/f12f298ab18d58a59c4ed8a589cd1cdc.jpg', 'path' => '/userdp/1/f12f298ab18d58a59c4ed8a589cd1cdc.jpg'))

我尝试了chmod 777 public并重启服务器。但是它没有起作用。


3
应该使用755而不是777。 - Chris Burton
3
切勿将777权限授予根文件夹,这会为专业黑客留下安全漏洞。请尽量绑定严格的安全规则,并仅向组/用户分配所需的权限/权利。 - Pratik Soni
9个回答

10

尝试:

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

6

错误:

  [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 对我有效!谢谢! - Fakher

4
我发现了一个非常有趣的解决方案。只需要像这个例子一样加上“.”号,对我很有效。
$destinationPath = "./public/uploads"; // upload path
    if (!file_exists($destinationPath)) {
      mkdir($destinationPath, 0755, true);
    }
    $request->sub_category_attr_value->move($destinationPath, $picName);

2

运行 chmod -R 777 可能不起作用,并且出于安全原因不应使用,这一直是一个警告。

=> 这将像@bokino12所述那样为您工作

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

=> 如果由于某些原因它无法正常工作,则可能是当前用户没有对该目录的权限,请尝试

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

这将将当前用户分配为目录的所有者。


2

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

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

2
您还需要对“userdp”递归地进行chmod操作:chmod -R 755 public/userdp - Jocke Med Kniven

0

请不要将模式更改为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);
}

0
为了解决这个问题,请进入您的Laravel项目,使您的公共目录可写。
sudo chmod -R 755 public

-7
我尝试了 chmod 777 public 并重启了服务器,但它没有起作用。 请确保您以管理员权限(如果可以)递归使用 CHMOD。
SUDO CHMOD -R 777 /var/www/html/laravel/

敬礼


这个命令会让整个服务器变得容易受攻击。请不要使用这个命令。 - GeorGios

-13
你需要递归地执行chmod,以确保所有子目录也具有相同的权限。请尝试运行以下命令:
chmod -R 777 

尽管这将解决您的问题,但您应该阅读关于设置上述权限会引起哪些问题的内容,下面在评论中提供了此链接。 我也会在这里发布:

https://dev59.com/EWgu5IYBdhLWcg3wgnVh#11271632

编辑:这应该只在 Laravel 存储目录 /var/www/html/laravel/storage 中完成,例如,绝不能在系统级别上完成。我最初忘记提到了这一点,因此导致了所有的反对票。


这很可能会破坏你的整个系统。 - mate.gvo
这个命令会让整个服务器变得容易受攻击。请不要使用这个命令。 - GeorGios
给予777权限后,您的代码肯定可以正常工作,但这会使服务器容易受到攻击。 - Ankit Jindal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接