PHP:使用fileperms和ftp\u chmod复制文件权限

PHP:使用fileperms和ftp\u chmod复制文件权限,php,permissions,ftp,file-permissions,chmod,Php,Permissions,Ftp,File Permissions,Chmod,总体目标: 使用PHP通过FTP上传文件时,从本地文件系统复制文件的权限 问题是: 虽然ftp_chmod似乎成功了,但根据代码中的print语句,我正在设置正确的权限,它设置了完全错误的权限 守则: <?php $perms = fileperms($src); if ($perms !== false) { // We only take the last 3 digits, since we're only interested in 'normal'

总体目标: 使用PHP通过FTP上传文件时,从本地文件系统复制文件的权限

问题是: 虽然ftp_chmod似乎成功了,但根据代码中的print语句,我正在设置正确的权限,它设置了完全错误的权限

守则:

<?php
    $perms = fileperms($src);
    if ($perms !== false) {
        // We only take the last 3 digits, since we're only interested in 'normal' file permissions, not extended ones.
        $perms &= 511;
        $permsm = sprintf('%o', $perms);
        print "DEBUG: Setting permissions: $perms :: ". decoct($perms) ." :: $permsm :: $dst\n";
        ftp_chmod($conn_id, $permsm, $dst);
    }
?>

使用
$perms&=0511
而不是
$perms&=511
。权限掩码采用八进制表示法,前面的0将使PHP将数字解释为八进制。

将$perms传递给ftp\u chmod,而不是$permsm。

正如我已经解释过的,print语句显示了正确的权限,这使我怀疑问题是否在此时产生。更改此行会导致print语句显示不正确的权限,并且无法解决此问题(上载文件的权限仍然不正确)。谢谢。这似乎使代码按预期工作(我可能应该看到这一点,但我花了这么长时间试图使代码工作,我在所有修改中都看不见了)。我仍然不完全理解为什么$permsm不起作用-这似乎是一个键入问题,但没有多少decoct/octdec循环或预结束“0”似乎可以解决这个问题。假设权限是rw-r--r--,或644$perms现在包含八进制数0644,即420位小数$permsm包含“0644”,它不是解释为八进制,而是解释为十进制数644,而您需要420。 -rw-r--r-- 1 allen users 15572 Jun 2 12:40 Foo.docx -rw-r--r-- 1 allen users 16877 Jun 2 12:40 Bar.docx drwxr-xr-x 2 allen users 4096 Jun 15 14:01 configuration drwxr-xr-x 9 allen users 4096 Jun 15 14:01 content drwxr-xr-x 3 allen users 4096 Jun 15 14:01 local -rw-r--r-- 1 allen users 152274 Jun 11 17:13 foo1.sql -rw-r--r-- 1 allen users 9984 Mar 2 10:44 footest.sql drwxrwxrwx 2 allen users 4096 Jun 15 14:01 tmp drwxr-xr-x 3 allen users 4096 Jun 15 14:01 versions --w----r-T 1 ftptest ftptest 15572 Jun 15 14:42 Foo.docx --w----r-T 1 ftptest ftptest 16877 Jun 15 14:42 Bar.docx d-wxrw--wt 2 ftptest ftptest 4096 Jun 15 14:42 configuration d-wxrw--wt 9 ftptest ftptest 4096 Jun 15 14:42 content d-wxrw--wt 3 ftptest ftptest 4096 Jun 15 14:42 local --w----r-T 1 ftptest ftptest 152274 Jun 15 14:42 foo1.sql --w----r-T 1 ftptest ftptest 9984 Jun 15 14:42 footest.sql dr----x--t 2 ftptest ftptest 4096 Jun 15 14:42 tmp d-wxrw--wt 3 ftptest ftptest 4096 Jun 15 14:42 versions