PHP:使用 fileperms 和 ftp_chmod 复制文件权限
总体目标: 使用 PHP 通过 FTP 上传文件时,从本地文件系统复制文件的权限。
问题: 虽然 ftp_chmod 似乎成功了,并且根据代码中的打印语句我设置了正确的权限,但它设置了完全错误的权限。
代码:
<?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);
}
?>
结果: 源/预期文件权限(本地文件系统):
-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
目标/实际结果文件权限(ftp 上传):
--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
The overall goal:
Copy the permissions of files from the local filesystem when uploading them over FTP using PHP.
The problem:
While ftp_chmod appears to succeed, and according to the print statement in the code I'm setting the right permissions, it sets completely wrong permissions.
The code:
<?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);
}
?>
The result:
Source / expected file permissions (local filesystem):
-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
Destination / actual result file permissions (ftp upload):
--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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
将 $perms 传递给 ftp_chmod,而不是 $permsm。
Pass $perms to ftp_chmod, not $permsm.
使用
$perms &= 0511
而不是$perms &= 511
。权限掩码采用八进制表示法,前面的 0 将使 PHP 将数字解释为八进制。Use
$perms &= 0511
instead of$perms &= 511
. Permission masks are in octal notation, and the preceding 0 will make PHP interpret the number as octal.