Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel存储SFTP和上载文件权限_Laravel_Storage_Sftp - Fatal编程技术网

Laravel存储SFTP和上载文件权限

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:SFTP(league/flysystemsftp)将一些文件上传到外部服务器。有一个小问题,一切都很顺利:文件上传时有0644(-rw-r--r--)权限。我试着在put方法上使用“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');