PHP 8.4.6 Released!

ftp_size

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

ftp_sizeReturns the size of the given file

Description

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

ftp_size() returns the size of the given file in bytes.

Note:

Not all servers support this feature.

Parameters

ftp

An FTP\Connection instance.

filename

The remote file.

Return Values

Returns the file size on success, or -1 on error.

Changelog

Version Description
8.1.0 The ftp parameter expects an FTP\Connection instance now; previously, a resource was expected.

Examples

Example #1 ftp_size() example

<?php

$file
= 'somefile.txt';

// set up basic connection
$ftp = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// get the size of $file
$res = ftp_size($ftp, $file);

if (
$res != -1) {
echo
"size of $file is $res bytes";
} else {
echo
"couldn't get the size";
}

// close the connection
ftp_close($ftp);

?>

See Also

  • ftp_rawlist() - Returns a detailed list of files in the given directory

User Contributed Notes

gerben at gerbs dot net
12 years ago
To overcome the 2 GB limitation, the ftp_raw solution below is probably the nicest. You can also perform this command using regular FTP commands:

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

[However, this] is insufficient for use on directories. As per RFC 3659 (http://tools.ietf.org/html/rfc3659#section-4.2), servers should return error 550 (File not found) if the command is issued on something else than a file, or if some other error occurred. For example, Filezilla indeed returns this string when using the ftp_raw command on a directory:

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

RFC 959 (http://tools.ietf.org/html/rfc959) dictates that the returned string always consists of exactly 3 digits, followed by 1 space, followed by some text. (Multi-line text is allowed, but I am ignoring that.) So it is probably better to split the string with substr, or even a regular expression.

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

Or with a regular expression:

<?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;
?>

You could then decide to assume that response code '550' means that it's a directory. I guess that's just as 'dangerous' as assuming that ftp_size -1 means that it's a directory.
project_t4 at hotmail dot com
21 years ago
Just to let people out there know, on my windows 2000 server running Apache and php i was returned 0 not -1 for directories.

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

This outputs a list of the remote directory and indicates which items are directories and which are files.
ibeono at gmail dot com
13 years ago
If you experience troubles with size of large file then you can use ftp_rawlist function and parse it result
chuck at t8design dot com
18 years ago
note that project_t4 at hotmail dot com's example above doesn't work in general, though it works on his Win2K/Apache server; as far as I can tell there is no way to check over ftp whether a directory exists. This function's behavior given a directory name seems to be at least somewhat dependent on your OS, web server, or ftp server, I don't know which.
adams[AT]techweavers[DOT]net
19 years ago
Well this function is nice but if you have files larger then 2.1Gb or 2.1 Billion Bytes you cannot get its size.
Anonymous
20 years ago
To get a dirsize recursive you can use this simple function:

<?php # copyright by 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 years ago
This will return the filesize on remote host and the size if you download it in FTP_BINARY mode. If you are using FTP_ASCII in ftp_get() the size can be changed.
victor59 at yahoo dot com dot hk
22 years ago
$file= 'filename with space.txt';
$size = ftp_size($this->ftp, urldecode($file) );

this one can correctly return the size
otherwize, it always return -1
miccots at gmail dot com
17 years ago
2 adams[AT]techweavers[DOT]net:
To get a size of large file (f. ex.: 3.2 Gb) you have to format the result returned by ftp_size():

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

So you can get the real size of big files. But this method is not good for checking is this a dir (when ftp_size() returns -1).
C_Muller
17 years ago
For checking if a certain folder exists try using ftp_nlist() function to get a directory list in array. By using in_array('foldername') you can find out if it is there or not.
bluerain [at] telenet [dot] be
15 years ago
To overcome the 2GB file size limit, you can open your own socket to get the file size of a large file. Quick and dirty script:

<?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