无法写入目录 - 数字海洋

时间:2016-04-20 03:28:08

标签: php laravel laravel-5 permissions chmod

我正在尝试上传带有帖子请求的图片并将其移至目录。我试过..

$file = $request->file('file');
$extension = strtolower($file->getClientOriginalExtension());

$finfo = finfo_open(FILEINFO_MIME_TYPE);

$generatedName = sha1(time().time());
$directory = '../public/uploads/imgs/'; // works
$fileName =  $generatedName . "." . $extension; // works

// 1
$file->move($directory, $fileName);
// 2
$file->move(base_path().$directory, $fileName);

此时,我收到错误:

  

1无法写入“../public/uploads/imgs”目录

     

2无法写入“var / www / laravel / public / uploads / imgs”目录

我认为这是由权限引起的,但也没有帮助..我试过

sudo chmod 770 /var/www/laravel/public/uploads (also /imgs/
and
sudo chmod -R 775 /var/www/laravel/public/uploads 

我还发现了其他的东西要尝试,但无法弄清楚要在用户名中写什么:

sudo chown username:www-data /var/www/laravel/public/uploads/

我在数字海洋上使用NGINX

6 个答案:

答案 0 :(得分:3)

从错误消息开始:

<强> 1。无法写入“../public/uploads/imgs”目录

默认情况下,您的nginx指向laravel安装的public文件夹。因此../public/uploads/imgs将解析为/var/www/laravel/public/uploads/imgs,如果它对laravel文件夹没有读取权限,则无法使用public

通常,nginx应该只对您的/var/www/laravel/public/var/www/laravel/public/uploads/imgs文件夹具有读取权限。

<强> 2。无法写入“var / www / laravel / public / uploads / imgs”目录

路径是相对路径。它的绝对路径是$directory = '../public/uploads/imgs/'; $file->move(base_path().$directory, $fileName); ,默认情况下不存在。

解决方案:

替换这些行:

$directory = 'uploads/imgs/';
$file->move(public_path().$directory, $fileName);

使用:

public

文档:https://laravel.com/docs/5.1/helpers#paths

警告:不要对您的index.php文件夹授予nginx写入权限!如果有人设法上传&amp;覆盖您的var answer = prompt("Who is your favorite Star Wars Character?", "Enter something, Rebel Scum."); switch (answer.toLowerCase()) { case "jar jar": case "jar jar binks": alert("hello"); break; } ,您的网站将遭到入侵。

答案 1 :(得分:2)

尝试运行此命令以授予upload目录及其所有子目录的写权限:

sudo chmod -R 775 /var/www/laravel/public/uploads

答案 2 :(得分:2)

我用数字海洋的具体案例解决了我的问题。首先我试过......

 useradd -U -G www-data -m -c "deploy" deploybot
 chown deploybot:www-data /var/www/laravel
 chmod 2755 /var/www/laravel

然后..

 sudo usermod -aG www-data deploybot
 sudo chown -R www-data:www-data /var/www/laravel
 sudo chown -R www-data:www-data /var/www/laravel/public/uploads
 sudo chmod -R 775 /var/www

更多信息herehere

答案 3 :(得分:1)

请在没有特定权限的情况下使用适当的权限创建目标路径imgs。请检查以下代码,您可以在其中授予imgs文件夹的权限。

$destinationPath = public_path().'/uploads/imgs/';

// Create folders if they don't exist
if (!file_exists($destinationPath)) {
   File::makeDirectory($destinationPath, $mode = 0755, true, true);
}

makeDirectory params将在here澄清。

仅供参考,$ mode将是0775,0777(认为它不应该给它)。

答案 4 :(得分:0)

首先尝试使用以下命令创建目录:

$directory_path = "...";//whatever you wish it to be

//if the directory doesn't exist already, it is created:
if (!file_exists($directory_path))
{
  mkdir($directory_path);
}

首先不要包含其他代码,只是为了看看你是否能够真正创建一个目录。如果它可以正常工作,请尝试在那里包含文件。如果这对您有用,请告诉我!

答案 5 :(得分:0)

sudo usermod -aG www-data deploybot \

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

sudo chown -R www-data:www-data / var / www / laravel / public / uploads

sudo chmod -R 775 / var / www

它对我有用 确保相应地更改您的用户 在这种情况下,它是deploybot