使用出色的 octdec 和 decoct 函数,您可以轻松实现这一点
<?php
$mode = "644";
$mode = octdec( str_pad($mode,4,'0',STR_PAD_LEFT) );
ftp_chmod($ftp_stream, $mode, $file);
?>
(PHP 5, PHP 7, PHP 8)
ftp_chmod — 通过 FTP 设置文件权限
将指定远程文件的权限设置为 permissions
。
成功时返回新的文件权限,错误时返回 false
。
版本 | 描述 |
---|---|
8.1.0 | ftp 参数现在期望一个 FTP\Connection 实例;以前,期望一个 资源。 |
示例 #1 ftp_chmod() 示例
<?php
$file = 'public_html/index.php';
// 设置基本连接
$ftp = ftp_connect($ftp_server);
// 使用用户名和密码登录
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);
// 尝试将 $file 的权限更改为 644
if (ftp_chmod($ftp, 0644, $file) !== false) {
echo "$file 已成功更改权限为 644\n";
} else {
echo "无法更改 $file 的权限\n";
}
// 关闭连接
ftp_close($ftp);
?>
使用出色的 octdec 和 decoct 函数,您可以轻松实现这一点
<?php
$mode = "644";
$mode = octdec( str_pad($mode,4,'0',STR_PAD_LEFT) );
ftp_chmod($ftp_stream, $mode, $file);
?>
只想为那些在通过 FTP 更改权限时仍然遇到问题的人贡献一个简短的说明。
如果您在 PHP 识别模式为整数时遇到问题,可以使用前一个海报的方法
$mode = octdec ( str_pad ( $mode, 4, '0', STR_PAD_LEFT ) );
并在其后添加以下代码段
$mode = (int) $mode;
这将强制 PHP 在您执行以下操作时识别模式为整数
ftp_chmod ( $conn_id, $mode, $path );
将这些组合在一起对我来说似乎从未失败过。
我花了一段时间才弄清楚如何在自己的情况下使用此函数,因为我需要将 $mode 作为从数据库中读取的变量传递给此函数。由于数据库返回的值是整数,没有前导零,所以我无法使操作正常工作,因为在 PHP 中添加前导零会将值转换为字符串。
例如,这在我的情况下不起作用
<?php
// 假设这是从数据库返回的值。
$mode = 644;
// 现在尝试使用此值进行 chmod。
ftp_chmod($conn_id, $mode, 'test.txt');
// 文件现在的权限为 204,而不是 644
?>
添加前导零也不起作用
<?php
// 假设这是从数据库返回的值。
$mode = 644;
// 现在尝试使用此值进行 chmod。
ftp_chmod($conn_id, '0'.$mode, 'test.txt');
// 文件现在的权限为 204,而不是 644
?>
我尝试了许多方法来使其正常工作,甚至使用 octdec 将其从八进制转换为十进制,然后又转换回十进制,但什么都没用。这是我唯一能使它正常工作的方法,使用 eval 语句。
<?php
// 假设这是从数据库返回的值。
$mode = 644;
// 将模式转换为字符串
$np = '0'.$mode;
// 现在使用 eval'd 字符串作为整数运行 chmod。
ftp_chmod($conn_id, eval("return({$np});"), 'test.txt');
// 文件现在的权限为 644
?>
当然,您必须确保 $mode 的值只包含 3 位数字。在将值传递给 eval() 之前,始终对您的值进行检查。
PHP5 ftp_chmod 函数的“mode”参数是一个整数,它应该作为八进制数给出,就像“chmod”命令行工具的参数一样。
因此 sprintf 必须使用 %o 格式字符,以便传递的整数值实际上被表示为 FTP 服务器的 CHMOD 站点命令的八进制数。
因此,在我看来,rabin 的版本是正确的(它确实对我有用)。
如以下注释中所述,由“hardy add mapscene dot com”发布的函数如果与八进制模式一起使用,则会出错,而 php5 函数就是这样使用的。
此函数与 php5 函数完全一样
<?php
if (!function_exists('ftp_chmod')) {
function ftp_chmod($ftp_stream, $mode, $filename)
{
return ftp_site($ftp_stream, sprintf('CHMOD %o %s', $mode, $filename));
}
}
?>
好的,
所以如果两个人说我的方法错了,而另一个人是对的,我将收回我的说法。
我发布它是因为对我来说,我使用它的方式有效(我不知道为什么)。
AND: 我不会说“我尝试过后再发布”,在我看来这很不友好,因为我已经尝试过了!
rabin 的代码可以完美地替代 ftp_chmod()。
在尝试 cspiegl 的解决方案之前,我建议先尝试这个方法,尤其是在 PHP 5 之前的版本。