2024年PHP开发者大会日本站

ftp_size

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_size返回给定文件的大小

描述

ftp_size(FTP\Connection $ftp, string $filename): int

ftp_size() 返回给定文件的大小(以字节为单位)。

注意:

并非所有服务器都支持此功能。

参数

ftp

一个 FTP\Connection 实例。

filename

远程文件。

返回值

成功时返回文件大小,出错时返回 -1。

变更日志

版本 描述
8.1.0 ftp 参数现在需要一个 FTP\Connection 实例;以前需要一个 资源

示例

示例 #1 ftp_size() 示例

<?php

$file
= 'somefile.txt';

// 建立基本连接
$ftp = ftp_connect($ftp_server);

// 使用用户名和密码登录
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// 获取$file的大小
$res = ftp_size($ftp, $file);

if (
$res != -1) {
echo
"$file 的大小是 $res 字节";
} else {
echo
"无法获取大小";
}

// 关闭连接
ftp_close($ftp);

?>

参见

添加注释

用户贡献的注释 11 条注释

gerben at gerbs dot net
12 年前
为了克服 2 GB 的限制,下面的 ftp_raw 解决方案可能是最好的。您也可以使用常规 FTP 命令执行此命令

<?php
$response
= ftp_raw($ftpConnection, "SIZE $filename");
$filesize = floatval(str_replace('213 ', '', $response[0]));
?>

[但是,这]不足以用于目录。根据 RFC 3659 (http://tools.ietf.org/html/rfc3659#section-4.2),如果命令在文件以外的其他对象上发出,或者发生其他错误,服务器应该返回错误 550(找不到文件)。例如,Filezilla 在对目录使用 ftp_raw 命令时确实返回此字符串

array(1) {
[0]=>
string(18) "550 File not found"
}

RFC 959 (http://tools.ietf.org/html/rfc959) 规定返回的字符串始终由正好 3 位数字、1 个空格以及某些文本组成。(允许多行文本,但我忽略了这一点。)因此,最好使用 substr 甚至正则表达式来分割字符串。

<?php
$response
= ftp_raw($ftp, "SIZE $filename");
$responseCode = substr($response[0], 0, 3);
$responseMessage = substr($response[0], 4);
?>

或者使用正则表达式

<?php
$response
= ftp_raw($ftp, "SIZE $filename");
if (
preg_match("/^(\\d{3}) (.*)$/", $response[0], $matches) == 0)
throw new
Exception("无法解析 FTP 回复:".$response[0]);
list(
$response, $responseCode, $responseMessage) = $matches;
?>

然后您可以决定假设响应代码“550”表示它是目录。我想这和假设 ftp_size -1 表示它是目录一样“危险”。
project_t4 at hotmail dot com
20 年前
只是想让大家知道,在我的运行 Apache 和 php 的 Windows 2000 服务器上,我返回的是 0 而不是目录的 -1。

foreach ($dir_list as $item)
{
if(ftp_size($conn_id, $item) == "0")
{
echo "<br>目录:: ".$item;
} else {
echo "<br>文件:: ".$item;
}
}

这将输出远程目录的列表,并指示哪些项目是目录,哪些项目是文件。
ibeono at gmail dot com
13 年前
如果您在处理大型文件大小时遇到问题,您可以使用 ftp_rawlist 函数并解析其结果
chuck at t8design dot com
18 年前
请注意,上面 project_t4 at hotmail dot com 的示例通常不起作用,尽管它在他的 Win2K/Apache 服务器上有效;据我所知,没有办法通过 ftp 检查目录是否存在。此函数在给定目录名称时的行为似乎至少在一定程度上取决于您的操作系统、Web 服务器或 ftp 服务器,我不知道是哪个。
adams[AT]techweavers[DOT]net
19 年前
这个函数很好,但是如果文件大于 2.1GB 或 21 亿字节,就无法获取其大小。
匿名用户
20 年前
要递归获取目录大小,可以使用这个简单的函数

<?php # 版权所有 fackelkind | codeMaster
function getRecDirSize ($connection, $dir){
$temp = ftp_rawlist ($connection, "-alR $dir");
foreach (
$temp as $file){
if (
ereg ("([-d][rwxst-]+).* ([0-9]) ([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9]) ([0-9]{2}:[0-9]{2}) (.+)", $file, $regs)){
$isdir = (substr ($regs[1],0,1) == "d");
if (!
$isdir)
$size += $regs[5];
}
}
return
$size;
}
$dirSize = getRecDirSize ($conID, "/");
?>
nicke_ at at_h9k dot com
21年前
这将返回远程主机上的文件大小以及您在 FTP_BINARY 模式下下载文件的大小。如果您在 ftp_get() 中使用 FTP_ASCII,则大小可能会改变。
victor59 at yahoo dot com dot hk
21年前
$file= '包含空格的文件名.txt';
$size = ftp_size($this->ftp, urldecode($file) );

这个可以正确返回大小
否则,总是返回 -1
miccots at gmail dot com
17年前
2 adams[AT]techweavers[DOT]net
要获取大文件(例如:3.2 GB)的大小,您必须格式化 ftp_size() 返回的结果

$size = sprintf ("%u", ftp_size($connection, $file_name));

这样您可以获取大文件的实际大小。但是此方法不适合检查是否是目录(当 ftp_size() 返回 -1 时)。
C_Muller
17年前
要检查某个文件夹是否存在,请尝试使用 ftp_nlist() 函数以数组形式获取目录列表。通过使用 in_array('foldername'),您可以找出它是否存在。
bluerain [at] telenet [dot] be
15年前
要克服 2GB 的文件大小限制,您可以打开自己的套接字来获取大文件的文件大小。快速简便的脚本

<?php
$socket
=fsockopen($hostName, 21);
$t=fgets($socket, 128);
fwrite($socket, "USER $myLogin\r\n");
$t=fgets($socket, 128);
fwrite($socket, "PASS $myPass\r\n");
$t=fgets($socket, 128);
fwrite($socket, "SIZE $fileName\r\n");
$t=fgets($socket, 128);
$fileSize=floatval(str_replace("213 ","",$t));
echo
$fileSize;
fwrite($socket, "QUIT\r\n");
fclose($socket);
?>
To Top