使用优秀的 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 将其从八进制转换为十进制,然后转换回 decoct,但没有任何效果。这是我唯一能够使其工作的办法,使用 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));
}
}
?>
好的,
所以如果两个人说我的方法是错的,而另一种方法是对的,我会收回我的说法。
我发布它是因为对我来说,我使用的方式有效(我不知道为什么)。
而且:我不会说类似“我会在发布前尝试”之类的话,在我看来,这真的很不友好,因为我已经尝试过了!