PHP Conference Nagoya 2025

ftp_size

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

ftp_sizeRetourne la taille d'un fichier

Description

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

ftp_size() retourne la taille d'un fichier donné en octets.

Note:

Tous les serveurs ne supportent pas cette fonctionnalité.

Liste de paramètres

ftp

Une instance de FTP\Connection.

filename

Le fichier distant.

Valeurs de retour

Retourne la taille du fichier en cas de succès, ou -1 si une erreur survient.

Historique

Version Description
8.1.0 La paramètre ftp attend désormais une instance de FTP\Connection ; auparavant, une ressource était attendu.

Exemples

Exemple #1 Exemple avec ftp_size()

<?php

$file
= 'somefile.txt';

// Mise en place d'une connexion basique
$ftp = ftp_connect($ftp_server);

// Identification avec un nom d'utilisateur et un mot de passe
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// Récupération de la taille du fichier $file
$res = ftp_size($ftp, $file);

if (
$res != -1) {
echo
"La taille du fichier $file est de $res octets";
} else {
echo
"Impossible de récupérer la taille du fichier";
}

// Fermeture de la connexion
ftp_close($ftp);

?>

Voir aussi

  • ftp_rawlist() - Fait une liste détaillée des fichiers d'un dossier

add a note

User Contributed Notes 11 notes

up
4
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.
up
1
project_t4 at hotmail dot com
20 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.
up
0
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
up
0
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.
up
0
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.
up
0
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, "/");
?>
up
0
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.
up
0
victor59 at yahoo dot com dot hk
21 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
up
-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).
up
-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.
up
-2
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