PHP Conference Japan 2024

ftp_fget

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

ftp_fget從 FTP 伺服器下載檔案並儲存到已開啟的檔案

說明

ftp_fget(
    FTP\Connection $ftp,
    資源 $stream,
    字串 $remote_filename,
    整數 $mode = FTP_BINARY,
    整數 $offset = 0
): 布林值

ftp_fget() 從 FTP 伺服器擷取 remote_filename,並將其寫入指定的檔案指標。

參數

ftp

一個 FTP\Connection 實例。

stream

一個已開啟的檔案指標,用於儲存數據。

remote_filename

遠端檔案路徑。

mode

傳輸模式。必須是 FTP_ASCIIFTP_BINARY

offset

開始下載的遠端檔案位置。

回傳值

成功時回傳 true,失敗則回傳 false

更新日誌

版本 說明
8.1.0 ftp 參數現在需要一個 FTP\Connection 實例;先前需要的是 資源
7.3.0 mode 參數現在是可選的。以前是必填的。

範例

範例 #1 ftp_fget() 範例

<?php

// 遠端檔案路徑
$remote_file = 'somefile.txt';
$local_file = 'localfile.txt';

// 開啟要寫入的檔案
$handle = fopen($local_file, 'w');

// 建立基本連線
$ftp = ftp_connect($ftp_server);

// 使用帳號和密碼登入
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// 嘗試下載 $remote_file 並儲存到 $handle
if (ftp_fget($ftp, $handle, $remote_file, FTP_ASCII, 0)) {
echo
"成功寫入到 $local_file\n";
} else {
echo
"下載 $remote_file$local_file 時發生問題\n";
}

// 關閉連線和檔案處理器
ftp_close($ftp);
fclose($handle);
?>

參見

  • ftp_get() - 從 FTP 伺服器下載檔案
  • ftp_nb_get() - 從 FTP 伺服器擷取檔案並將其寫入到本機檔案(非阻塞)
  • ftp_nb_fget() - 從 FTP 伺服器擷取檔案並將其寫入到已開啟的檔案(非阻塞)

新增筆記

使用者貢獻的筆記 6 則筆記

8
broom at alturnanetworks dot com
16 年前
另一種 ftp_get_contents 的方法,使用暫存串流處理器。將檔案內容作為字串返回。

<?php
function ftp_get_contents ($conn_id, $filename,
//建立暫存處理器:
$tempHandle = fopen('php://temp', 'r+');

//從 FTP 取得檔案,假設檔案存在:
ftp_fget($conn_id, $tempHandle, $filename, FTP_ASCII, 0));

//取得詳細統計資訊以檢查檔案大小:
$fstats = fstat($tempHandle);

return
fread($tempHandle, $fstats['size']);
}
?>
5
broom at alturnanetworks dot com
16 年前
<?php
/**
* 函式透過 FTP 連線返回內容,並將其作為字串返回(正確版本...)
*/
function ftp_get_contents ($conn_id, $filename) {
//建立暫存處理器:
$tempHandle = fopen('php://temp', 'r+');

//從 FTP 取得檔案:
if (@ftp_fget($conn_id, $tempHandle, $filename, FTP_ASCII, 0)) {
rewind($tempHandle);
return
stream_get_contents($tempHandle);
} else {
return
false;
}
}
?>
2
mike at eastghost dot com
11 年前
如果您在防火牆後方,並且遇到奇怪的逾時、檔案建立但沒有儲存本機資料等問題,則可能需要使用 ftp_pasv()。
0
lionskape at gmail dot com
7 年前
如果您使用的是編碼為 cp1251 的 Windows FTP 伺服器,則檔名/路徑中的俄文 "я" 會出現一些問題。

PHP 使用 telnet 連線到 FTP 伺服器,並且在 telnet 協定中有一個代碼為 255 的特殊符號。您可以嘗試使用 ftp_raw($connection, 'OPTS UTF8 ON'); 並以 UTF-8 編碼工作(如果伺服器提供此功能)。

附註:抱歉,我的英文不好。
-1
justrafi at gmail dot com
16 年前
我需要同步兩個不同伺服器上的資料夾,一個是 Windows 伺服器,另一個是 Linux 伺服器。我建立了這個簡短的函式來幫助我完成這項工作。請注意:這不會複製資料夾,如果遠端資料夾包含檔案以外的任何內容,則可能會失敗。

function sync_folders($host, $port, $username, $password, $remote_dir, $local_dir, $passive_mode = true) {
$conn_id = ftp_connect($host, $port);
if (!$conn_id) return false; // 連線失敗
if (!ftp_login($conn_id, $username, $password)) { ftp_close($conn_id); return false; } // 登入失敗
ftp_pasv($conn_id, $passive_mode);
if (!ftp_chdir($conn_id, $remote_dir)) { ftp_close($conn_id); return false; } // 切換目錄失敗
if (substr($local_dir, -1) != '/') $local_dir .= '/';

$list = ftp_nlist($conn_id, '.');
sort($list);
foreach ($list as $file) {
if (!file_exists($local_dir . $file)) {
$is_copied = ftp_get($conn_id, $local_dir . $file, $file, FTP_BINARY);
}
}
ftp_close($conn_id);
return true;
}
-3
rodrigo-rocha at oi dot net dot br
22 年前
如果您只提供檔名給 ftp_get 函式的第二個參數,ftp_get 將會開啟一個指向本地檔案的指標,建立該檔案並寫入其中。如果您的伺服器執行時間不長,而且您沒有取得太多檔案,這樣沒問題,但是如果您執行太多次,ftp_get 建立的指標將不會被關閉,並且會耗盡伺服器上已開啟檔案的容量,使其無法再開啟任何檔案,直到您重新啟動它為止。
To Top