Laravel 存储:权限问题 - Storage::move() 与 get()、put()、delete() 的区别

4
我发现这有点奇怪。 使用laravel Storage 外观时,如果我尝试移动一个文件:
Storage::move ($source_file, $dest_file);

我遇到了以下错误:

rename(/source/file/name1.docx, /dest/file/name2.docx): Permission denied

然而,如果我尝试显式地复制文件,将其写入目标位置并删除原始文件,可以按照以下方式进行:
$fcontents = Storage::get ($source_file);
Storage::put ($dest_file, $fcontents, 'public');
Storage::delete ($source_file);

它运行得非常好。

我在一个nginx CentOS平台上运行Laravel。一个稍微有点复杂的因素是底层文件系统是挂载的Samba共享。但是,在命令行中这不会导致任何问题。

从shell命令,如果我执行一个移动操作(使用与运行nginx服务的用户相同的用户)mv /source/file/name1.docx /source/file/name2.docx,它不会抱怨任何权限问题。

有人有线索吗?


编辑20/02/2018以添加更多信息

samba挂载在/etc/fstab中如下:

//10.1.12.123;public /my/mount/point/public cifs credentials=/my/passfile,uid=1003,gid=1003 0 0

这个挂载工作正常,我可以在Bash shell中遍历文件系统。

@> ls -lFd /my/mount/point/public
drwxrwxrwx 11 webuser webgroup  0  Dec 4 13:30 /my/mount/point/public//

(我不确定上一行末尾的双斜杠是否有意义。)

顺便说一下,777权限显然是由挂载过程定义的。 我似乎没有改变它的能力。 我将寻求减少此特权作为离线活动,但出于解决此问题的目的,我打算证明文件系统级别的权限似乎不是问题的原因。


你是否检查了源目录和目标目录的所有权和权限?移动文件有时会出现问题,但复制则没有问题。因此,请确认一下服务器上该目录的权限和所有权。 - BetaDev
@webDev 我挂载的Samba驱动器权限为777。这不是我可以控制的,因为cifs挂载过程似乎会代表我设置权限。 - cartbeforehorse
@webDev 我已经更新了问题描述,为您添加了更多信息。 - cartbeforehorse
1个回答

2

答案可能在文档中!

Laravel的Illuminate\Filesystem{}类使用了PHP函数rename()

阅读此函数文档页面的详细信息,我发现以下内容 >>

在类Unix操作系统上,文件系统可能会挂载带有显式uid和/或gid的(例如,使用mount选项“uid=someuser,gid=somegroup”)。尝试使用此类目标文件系统调用rename()将导致“Operation not permitted”警告,即使文件确实被重命名并且rename()返回(bool) true。

这不是一个错误。要么按照适合您的用例处理警告,要么调用copy(),然后unlink(),这将避免注定失败的chown()和chmod()调用,从而消除警告。

叹气。虽然这不是一个错误,但它肯定感觉像一个错误。

此外,尽管它感觉很接近,但这并不完全反映我的问题,因为文件并没有被“确实重命名”(即移动)正确。而且,“操作不允许”不是我收到的错误。尽管如此,这是迄今为止我发现的最有可能的解释。

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