Laravel Storage SFTP和上传的文件权限

时间:2019-03-28 10:30:53

标签: laravel storage sftp

我正在使用Storage:SFTP(league / flysystem-sftp)将一些文件上传到外部服务器。一切顺利,但有一个小问题:使用0644(-rw-r--r--)权限上传文件。我试图在put方法上使用'public'选项作为文档的示例,例如

Storage::disk('remote-sftp')->put($filename, $contents, 'public');

但是如果返回FALSE失败并且不上传文件。

如果我删除了“ public”参数,那么一切进展都很好,但是文件权限错误。

有什么方法可以将上传的文件权限设置为0666吗?

5 个答案:

答案 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 驱动程序的所有可能的键。您可以在配置文件中将 directoryPerm0744 更改为 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'获得权限。

vendor / league / flysystem-sftp / src / SftpAdapter.php

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

umask

如果未设置'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');

假设文件名也具有路径。