7
votes

I'm running the following script for an image upload in a server and getting the following error while it works perfectly on the localhost.

Code

$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);
}

Error

ErrorException in UploadController.php line 605: mkdir(): Permission denied

at HandleExceptions->handleError('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'))

I tried chmod 777 public and restarted the server. But it didn't work.

9
You should use 755 not 777.Chris Burton
Never ever give 777 permission to your root folder. Its security leak for profession hackers. Please try to bind tight security rules and assign only needed permissions / rights to the group / user.Pratik Soni

9 Answers

-9
votes

You have to perform chmod recursively to make sure all subdirectories also carry the same permissions. Try running this instead:

chmod -R 777 

Now while this will fix your issue, you should definitely read up on the problems that arise with setting the above permissions as this link posted in comments below shows. Ill post here as well:

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

EDIT: This should only be done within the Laravel storage dir within /var/www/html/laravel/storage, for example and never be done at the system level. I forgot to mention that originally, hence all the downvotes.

9
votes

Try:

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

I have found a very interesting solution to this problem. Just put "." sign like this example. It works for me.

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

You are trying to move the uploaded file a folder in the root of your server. Make sure you get the absolute path right.

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

Running chmod -R 777 may not work and should never be used for security reasons, this has always been a warning.

=> This will work of for you as stated above by @bokino12

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

=> if for some reason it doesn't work, that could be that the present user doesn't have permission over the directory, try

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

This will assign the current user as the owner of the directory.

2
votes

ERROR:

  [ErrorException]            
  mkdir(): Permission denied 

If you are creating Project in /WWW folder and if you are encountering the above error, then try using following commands, It worked for me.

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

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

After Running this, Try Creating Project again.

cd /var/www

composer create-project laravel/laravel projectname "5.6.*"

since i'm using laravel 5.6 i have specified version while creating Project.

0
votes

Please dont change mode to 777 as it may cause your some serious security issues. Rather try using these commands for changing permission of the folder.

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

Try uploading - It will work - In case it fails try

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

To solve this problem, go into your laravel project, make your public directory writable.

sudo chmod -R 755 public
-4
votes

I tried chmod 777 public and restarted the server. But it didn't work.

Be sure you use the CHMOD recursively and with administrator permissions (if you can)

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

Regards