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
"size of $file is $res bytes";
} else {
echo
"couldn't get the size";
}

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

?>

参见

添加注释

用户贡献注释 11 个注释

4
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("Unable to parse FTP reply: ".$response[0]);
list(
$response, $responseCode, $responseMessage) = $matches;
?>

然后您可以决定假设响应代码“550”意味着它是一个目录。我想这和假设 ftp_size -1 代表目录一样“危险”。
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>Directory:: ".$item;
} else {
echo "<br>File:: ".$item;
}
}

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

<?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, "/");
?>
0
nicke_ at at_h9k dot com
20 年前
此函数将返回远程主机上的文件大小,以及使用 FTP_BINARY 模式下载时的文件大小。如果在 ftp_get() 中使用 FTP_ASCII,文件大小可能会发生变化。
0
victor59 at yahoo dot com dot hk
21 年前
$file= 'filename with space.txt';
$size = ftp_size($this->ftp, urldecode($file) );

此代码可以正确返回文件大小
否则,它将始终返回 -1
-1
miccots at gmail dot com
16 年前
2 adams[AT]techweavers[DOT]net
要获取大型文件的大小(例如:3.2 Gb),您需要格式化 ftp_size() 返回的结果

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

这样可以获取大型文件的真实大小。但此方法不适合检查是否为目录(当 ftp_size() 返回 -1 时)。
-1
C_Muller
17 年前
要检查特定文件夹是否存在,请使用 ftp_nlist() 函数以数组形式获取目录列表。使用 in_array('foldername') 可以确定文件夹是否存在。
-2
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