无法在目录中写入 - Digital Ocean

Unable to write in the Directory - Digital Ocean

我正在尝试使用 post 请求上传图像并将其移动到目录。我试过了..

$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 Unable to write in the "../public/uploads/imgs" directory

2 Unable to write in the "var/www/laravel/public/uploads/imgs" directory


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

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/

我在 Digital Ocean 上使用 NGINX

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

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

首先尝试创建目录:

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

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

我用 Digital Ocean 的特定案例解决了我的问题。首先我尝试了...

 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

更多信息here and here

从您的错误消息开始:

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

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

通常情况下,nginx 应该只有对您的 public 文件夹的读取权限。

2。无法写入 "var/www/laravel/public/uploads/imgs" 目录

路径是相对路径。它的绝对路径是 /var/www/laravel/public/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);

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

警告:不要给 nginx 写访问你的 public 文件夹!如果有人设法上传并覆盖您的 index.php,您的网站将受到威胁。

请创建具有适当权限的目标路径 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 参数的位置将在 here 中阐明。

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

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