Laravel存储SFTP和上载文件权限
我使用Storage:SFTP(league/flysystemsftp)将一些文件上传到外部服务器。有一个小问题,一切都很顺利:文件上传时有0644(-rw-r--r--)权限。我试着在put方法上使用“public”选项作为文档中的示例,如Laravel存储SFTP和上载文件权限,laravel,storage,sftp,Laravel,Storage,Sftp,我使用Storage:SFTP(league/flysystemsftp)将一些文件上传到外部服务器。有一个小问题,一切都很顺利:文件上传时有0644(-rw-r--r--)权限。我试着在put方法上使用“public”选项作为文档中的示例,如 Storage::disk('remote-sftp')->put($filename, $contents, 'public'); 但是如果返回FALSE失败,则不会上载文件 如果我删除“public”参数,一切都会顺利,但文件的权限不正确 有
Storage::disk('remote-sftp')->put($filename, $contents, 'public');
但是如果返回FALSE失败,则不会上载文件
如果我删除“public”参数,一切都会顺利,但文件的权限不正确
有没有办法将上载的文件权限设置为类似0666的值?请尝试以下操作:
Storage::disk('remote-sftp')->put($filename, $contents)->setVisibility( $filename, 'public');
假设文件名也有路径..最后,解决方案是结合Alpy的答案和配置。 调用setVisibility()没有失败,但将权限保留在0644中。深入研究FTP/SFTP驱动程序发现,“public”权限有一个模式,可以使用“permPublic”密钥在config中分配,因此在config/filesystems.php中写入所需的八进制权限
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
],
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
'remote-sftp' => [
'driver' => 'sftp',
'host' => '222.222.222.222',
'username' => 'myuser',
'password' => 'mypassword',
'visibility' => 'public',
'permPublic' => 0766, /// <- this one did the trick
// 'port' => 22,
'root' => '/home',
// 'timeout' => 30,
],
],
“磁盘”=>[
“本地”=>[
“驱动程序”=>“本地”,
'root'=>存储路径('app'),
],
“公共”=>[
“驱动程序”=>“本地”,
'root'=>存储路径('app/public'),
'url'=>env('APP_url')。/storage',
“可见性”=>“公共”,
],
“远程sftp”=>[
“驱动程序”=>“sftp”,
“主机”=>“222.222.222.222”,
“用户名”=>“我的用户”,
“密码”=>“我的密码”,
“可见性”=>“公共”,
“permPublic”=>0766,///22,
“根”=>“/home”,
//“超时”=>30,
],
],
]) 文件权限基于两个因素。可见性和权限。您可以在驱动程序配置中设置以下两个选项:
'remote' => [
'driver' => 'sftp',
'host' => 'hostname',
'root' => '/',
'username' => 'user',
'password' => env('SYSTEM_PASS'),
'visibility' => 'public', // defaults to 'private'
'permPublic' => 0775
]
权限是根据可见性设置的。因此,如果您设置'permPublic'
而不设置'visibility'
则不会发生任何更改,因为setVisibility()
函数使用'visibility'
来获取权限
供应商/league/flysystem sftp/src/SftpAdapter.php
公共默认值为0755
私有默认值为0700
乌马斯克
如果未设置“可见性”
,我相信权限是根据远程系统用户的umask设置的。如果选择,您可以在远程系统上对此进行修改
名录
使用权限时需要注意的一点是,这只会影响已创建的文件。要设置已创建目录的权限,请在配置中使用'directoryPerm'
属性
这默认为
0744
存储::磁盘('sftp')->下载(…这是一个更全局、更高效的解决方案。在递归目录下保存文件时,我需要控制对文件和目录的权限
League SFTPapter正在递归地创建目录(如果还不存在)。但主要问题是,它不会为目录添加permPublic=>0755
,而只添加文件,因此www data
用户最终无法访问新创建目录中的文件。解决方案是深入代码查看发生了什么:
'disks' => [
'remote-sftp' => [
'driver' => 'sftp',
'host' => '222.222.222.222',
'port' => 22,
'username' => 'user',
'password' => 'password',
'visibility' => 'public', // set to public to use permPublic, or private to use permPrivate
'permPublic' => 0755, // whatever you want the public permission is, avoid 0777
'root' => '/path/to/web/directory',
'timeout' => 30,
'directoryPerm' => 0755, // whatever you want
],
],
在League\Flysystem\Sftp\StfpAdapter
中,有两个重要属性需要清楚地看到:
/**
* @var array
*/
protected $configurable = ['host', 'hostFingerprint', 'port', 'username', 'password', 'useAgent', 'agent', 'timeout', 'root', 'privateKey', 'passphrase', 'permPrivate', 'permPublic', 'directoryPerm', 'NetSftpConnection'];
/**
* @var int
*/
protected $directoryPerm = 0744;
$configurable
是以上配置文件系统sftp驱动程序的所有可能键。您可以在配置文件中将directoryPerm
从0744
更改为0755
:
'directoryPerm' => 0755,
但是,由于StfpAdapter中有一种类似于Bug的错误,它不会在createDir
上使用$config参数:
$filesystem = Storage::disk('remote-sftp');
$filesystem->getDriver()->getAdapter()->setDirectoryPerm(0755);
$filesystem->put('dir1/dir2/'.$filename, $contents);
或者将其设置为公共目的:
$filesystem->put('dir1/dir2/'.$filename, $contents, 'public');
谢谢!呼叫->设置可见性($fn,'public'))返回“true”,但权限仍然相同。请检查是否可以使用原始sftp设置chmod 0666。通常情况下,这是我试图避免使用的方法。具有如此出色的文件系统抽象,降到如此低的级别似乎太多了。我将试着查看实现,以找出是否有办法。没有任何问题关于低级别,您只需消除由于某些原因而可能出现的故障。setVisibility必须工作,这样您就可以进行简单的测试。但这是您的呼叫。显然,我在发布setVisibility之前进行了测试。似乎是setVisibility()使用的属性导致了问题。
$ftp=Storage::disk('sftp')->put($remote_path,fopen($uploadedFile,'r+')->setVisibility($remote_path,'public');
我试着做了和你一样的事情。permPublic
设置在filesystems.php
上。但是我在布尔值上得到了这个setVisibility()。请阅读代码,上面写着“这一个成功了”谢谢!我的问题与默认权限有关,默认设置为0644。在配置中将它们设置为0755可以让事情顺利进行。?你在哪里发现默认设置为0755和0700?这不是我的工作方式,我必须更改它们。请在你的回答中解释这有什么作用。答案有更多解释o经常在这里做得更好。谢谢!对我来说,路径是给定的,所以没有问题,但有这个提示在这里很好。
$filesystem->put('dir1/dir2/'.$filename, $contents, 'public');