我正在使用Storage:SFTP(league / flysystem-sftp)将一些文件上传到外部服务器。一切顺利,但有一个小问题:使用0644(-rw-r--r--)权限上传文件。我试图在put方法上使用'public'选项作为文档的示例,例如
Storage::disk('remote-sftp')->put($filename, $contents, 'public');
但是如果返回FALSE失败并且不上传文件。
如果我删除了“ public”参数,那么一切进展都很好,但是文件权限错误。
有什么方法可以将上传的文件权限设置为0666吗?
答案 0 :(得分:1)
这里有一个更全球化、更高效的解决方案。在递归目录下保存文件时,我需要控制文件和目录的权限。
League SftpAdapter 正在递归创建目录(如果尚不存在)。但主要问题是,它不会为目录添加 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 https://github.com/thephpleague/flysystem-sftp/issues/81 中有一个类似的错误,它不会在 createDir
上使用 $config 参数:
$filesystem = Storage::disk('remote-sftp');
$filesystem->getDriver()->getAdapter()->setDirectoryPerm(0755);
$filesystem->put('dir1/dir2/'.$filename, $contents);
或者将其设置为 public :
$filesystem->put('dir1/dir2/'.$filename, $contents, 'public');
答案 1 :(得分:0)
最后,解决方案是Alpy的答案和配置的结合。 调用setVisibility()不会失败,但是将权限保留在0644中。深入FTP / SFTP驱动程序后,发现“公共”权限具有可以使用“ 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,
],
],
];
答案 2 :(得分:0)
文件权限基于两个因素。可见性和权限。您可以在驱动程序配置中设置这两个选项,例如:
'remote' => [
'driver' => 'sftp',
'host' => 'hostname',
'root' => '/',
'username' => 'user',
'password' => env('SYSTEM_PASS'),
'visibility' => 'public', // defaults to 'private'
'permPublic' => 0775
]
根据可见性设置权限。因此,如果您设置'permPublic'
而未设置'visibility'
,则不会有任何改变,setVisibility()
函数将使用'visibility'
获得权限。
public function setVisibility($path, $visibility)
{
$visibility = ucfirst($visibility);
if (! isset($this->{'perm'.$visibility})) {
throw new InvalidArgumentException('Unknown visibility: '.$visibility);
}
$connection = $this->getConnection();
return $connection->chmod($this->{'perm'.$visibility}, $path);
}
公共默认值为0755
。
私有默认值为0700
。
如果未设置'visibility'
,那么我相信将根据远程系统用户的umask设置权限。如果愿意,您可以在远程系统上进行修改。 set umask for user
使用权限时要注意的一件事是,这只会影响创建的文件。要在创建的目录上设置权限,请在配置中使用'directoryPerm'
属性。
此默认值为0744
答案 3 :(得分:0)
Storage :: disk('sftp')-> download(...
答案 4 :(得分:-1)
请尝试以下操作:
Storage::disk('remote-sftp')->put($filename, $contents)->setVisibility( $filename, 'public');
假设文件名也具有路径。