PHP Conference Japan 2024

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
"$file 的大小為 $res 位元組";
} else {
echo
"無法取得大小";
}

// 關閉連線
ftp_close($ftp);

?>

參見

新增註解

使用者貢獻的註解 11 則註解

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(找不到檔案)。例如,在目錄上使用 ftp_raw 指令時,Filezilla 確實會傳回這個字串

array(1) {
[0]=>
字串(18) "550 檔案未找到"
}

RFC 959 (http://tools.ietf.org/html/rfc959) 規定回傳的字串永遠是由三個數字,接著一個空格,然後是一段文字所組成。(允許多行文字,但我現在先忽略這個情況。)所以最好使用 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("無法解析 FTP 回應:".$response[0]);
list(
$response, $responseCode, $responseMessage) = $matches;
?>

然後你可以假設回應碼 '550' 表示它是一個目錄。我猜這和假設 ftp_size -1 表示它是一個目錄一樣「危險」。
project_t4 at hotmail dot com
20 年前
只是想讓大家知道,在我的 Windows 2000 伺服器上運行 Apache 和 PHP 時,目錄回傳的是 0 而不是 -1。

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

這會輸出遠端目錄的列表,並指出哪些項目是目錄,哪些是檔案。
ibeono at gmail dot com
13 年前
如果您遇到大型檔案大小的問題,您可以使用 ftp_rawlist 函數並解析其結果。
chuck at t8design dot com
18 年前
請注意,project_t4 at hotmail dot com 上面的例子並非總是有效,儘管它在他的 Win2K/Apache 伺服器上有效;據我所知,沒有辦法透過 FTP 檢查目錄是否存在。給定目錄名稱時,此函數的行為似乎至少在某種程度上取決於您的作業系統、網路伺服器或 FTP 伺服器,我不確定是哪一個。
adams[AT]techweavers[DOT]net
19 年前
這個函數很好用,但如果您的檔案大於 2.1GB 或 21 億位元組,則無法取得其大小。
匿名
20 年前
要遞迴取得目錄大小,您可以使用這個簡單的函數

<?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, "/");
?>
nicke_ at at_h9k dot com
21 年前
這會返回遠端主機上的檔案大小,以及以 FTP_BINARY 模式下載時的大小。如果您在 ftp_get() 中使用 FTP_ASCII,大小可能會改變。
victor59 at yahoo dot com dot hk
21 年前
$file= 'filename with space.txt';
$size = ftp_size($this->ftp, urldecode($file) );

這個可以正確返回大小
否則,它總是返回 -1
miccots at gmail dot com
17 年前
2 adams[AT]techweavers[DOT]net
要取得大檔案的大小(例如:3.2 Gb),您必須格式化 ftp_size() 返回的結果

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

這樣您就可以獲得大檔案的實際大小。但是這種方法不適用於檢查這是否是目錄(當 ftp_size() 返回 -1 時)。
C_Muller
17 年前
要檢查特定資料夾是否存在,請嘗試使用 ftp_nlist() 函數以陣列形式取得目錄列表。透過使用 in_array('foldername'),您可以查明它是否存在。
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