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.
PHP.mk документација
ftp_size
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Патека
function.ftp-size.php
Локална патека за оваа страница.
Извор
php.net/manual/en
Оригиналниот HTML се реупотребува и локално се стилизира.
Режим
Прокси + превод во позадина
Кодовите, табелите и белешките остануваат читливи во истиот тек.
Референца
function.ftp-size.php
ftp_size
Референца за `function.ftp-size.php` со подобрена типографија и навигација.
ftp_size
(PHP 4, PHP 5, PHP 7, PHP 8)
ftp_size — Returns the size of the given file
= NULL
ftp_size() Ја враќа големината на датотеката.
Забелешка:
ја враќа големината на датотеката во бајти.
Вратени вредности
Датотеката оддалечена.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.1.0 |
На ftp параметарот очекува FTP\Connection
инстанца сега; претходно, а resource се очекуваше.
|
Примери
Пример #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);
?>Белешки од корисници 11 белешки
cyberhorse at users dot sourceforge dot net ¶
пред 13 години
- Враќа детален список на датотеки во дадената директориум ¶
пред 22 години
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.
project_t4 на hotmail точка com ¶
пред 14 години
If you experience troubles with size of large file then you can use ftp_rawlist function and parse it result
ibeono на gmail точка com ¶
19 години пред
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.
chuck на t8design точка com ¶
20 години пред
Well this function is nice but if you have files larger then 2.1Gb or 2.1 Billion Bytes you cannot get its size.
Анонимен ¶
21 години пред
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, "/");
?>
adams[AT]techweavers[DOT]net ¶
пред 22 години
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.
nicke_ на at_h9k точка com ¶
пред 23 години
$file= 'filename with space.txt';
$size = ftp_size($this->ftp, urldecode($file) );
this one can correctly return the size
otherwize, it always return -1
victor59 на yahoo точка com точка hk ¶
пред 18 години
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 ¶
пред 18 години
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.
miccots на gmail точка com ¶
пред 16 години
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);
?>