文字

ftp_size

(PHP 4, PHP 5, PHP 7)

ftp_size返回指定文件的大小

说明

int ftp_size ( resource $ftp_stream , string $remote_file )

ftp_size() 函数以字节返回远程文件 remote_file 的大小。如果指定文件不存在或发生错误,则返回 -1。有些 FTP 服务器可能不支持此特性。

Note:

获取成功返回文件大小,否则返回 -1。

参数

ftp_stream

FTP 连接资源。

remote_file

远程文件。

返回值

执行成功返回文件大小,失败返回 -1。

范例

Example #1 ftp_size() 例子

<?php
$file 
'somefile.txt' ;

// set up basic connection 
$conn_id  ftp_connect ( $ftp_server );

// login with username and password
$login_result  ftp_login ( $conn_id $ftp_user_name $ftp_user_pass );

// get the size of $file
$res  ftp_size ( $conn_id $file );

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

//close the conntion
ftp_close ( $conn_id );
?>

参见

  • ftp_rawlist() - 返回指定目录下文件的详细列表

用户评论:

[#1] gerben at gerbs dot net [2012-06-22 19:25:51]

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], 03);
$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.

[#2] ibeono at gmail dot com [2011-07-28 04:19:09]

If you experience troubles with size of large file then you can use ftp_rawlist function and parse it result

[#3] bluerain [at] telenet [dot] be [2009-07-10 01:41:18]

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($hostName21);
$t=fgets($socket128);
fwrite($socket"USER $myLogin\r\n");
$t=fgets($socket128);
fwrite($socket"PASS $myPass\r\n");
$t=fgets($socket128);
fwrite($socket"SIZE $fileName\r\n");
$t=fgets($socket128);
$fileSize=floatval(str_replace("213 ","",$t));
echo 
$fileSize;
fwrite($socket"QUIT\r\n");
fclose($socket);
?>

[#4] miccots at gmail dot com [2007-10-30 01:55:31]

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).

[#5] C_Muller [2007-07-21 15:42:50]

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.

[#6] chuck at t8design dot com [2006-05-23 09:54:51]

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.

[#7] adams[AT]techweavers[DOT]net [2005-06-21 14:30:51]

Well this function is nice but if you have files larger then 2.1Gb or 2.1 Billion Bytes you cannot get its size.

[#8] [2004-09-28 18:10: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"/");
?>

[#9] project_t4 at hotmail dot com [2004-03-18 11:03:14]

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.

[#10] nicke_ at at_h9k dot com [2003-10-03 18:48:31]

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.

[#11] victor59 at yahoo dot com dot hk [2002-12-23 01:44:14]

$file= 'filename with space.txt';
$size = ftp_size($this->ftp, urldecode($file) );

this one can correctly return the size
otherwize, it always return -1

上一篇: 下一篇: