若要直接將內容插入 FTP 主機上的檔案,您也可以建立一個字串串流,直接串流到 ftp_fput 函式。
這樣做應該比先寫入任何本地暫存目錄再進行串流的負擔更小,如同這裡建議的。
<?php
$string = "Your content goes here";
$stream = fopen('data://text/plain,' . $string,'r');
ftp_fput($this->connection,$pathTo,$stream, FTP_BINARY);
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
ftp_fput — 從開啟的檔案上傳到 FTP 伺服器
ftp_fput() 會將檔案指標中的資料上傳到 FTP 伺服器上的遠端檔案。
ftp
一個 FTP\Connection 實例。
remote_filename
遠端檔案路徑。
stream
本地檔案上已開啟的檔案指標。讀取會在檔案結尾處停止。
mode
傳輸模式。必須是 FTP_ASCII
或 FTP_BINARY
。
offset
開始上傳到遠端檔案中的位置。
版本 | 說明 |
---|---|
8.1.0 | ftp 參數現在需要一個 FTP\Connection 實例;先前需要的是一個 資源。 |
7.3.0 | mode 參數現在是可選的。以前是強制性的。 |
範例 #1 ftp_fput() 範例
<?php
// 開啟檔案以供讀取
$file = 'somefile.txt';
$fp = fopen($file, 'r');
// 設定基本連線
$ftp = ftp_connect($ftp_server);
// 使用使用者名稱和密碼登入
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);
// 嘗試上傳 $file
if (ftp_fput($ftp, $file, $fp, FTP_ASCII)) {
echo "已成功上傳 $file\n";
} else {
echo "上傳 $file 時發生問題\n";
}
// 關閉連線和檔案處理器
ftp_close($ftp);
fclose($fp);
?>
若要直接將內容插入 FTP 主機上的檔案,您也可以建立一個字串串流,直接串流到 ftp_fput 函式。
這樣做應該比先寫入任何本地暫存目錄再進行串流的負擔更小,如同這裡建議的。
<?php
$string = "Your content goes here";
$stream = fopen('data://text/plain,' . $string,'r');
ftp_fput($this->connection,$pathTo,$stream, FTP_BINARY);
?>
如果在使用 fput 時,您遇到以下錯誤之一:
警告:ftp_fput() [function.ftp-fput]: 開啟 ASCII 模式資料連線
警告:ftp_fput() [function.ftp-fput]: 開啟 BINARY 模式資料連線
而且它在正確的位置建立了檔案,但檔案大小為 0kb,且之後的所有 FTP 指令都失敗。這很可能是因為客戶端位於防火牆後方。要解決此問題,請使用
<?php
ftp_pasv($resource, true);
?>
在執行任何 put 指令之前。我花了很長時間才弄清楚這一點,當我解決時,我真的歡呼了 :D
當您的檔案內容是字串時,請建立暫存串流並將其用作檔案控制代碼。
<?php
$contents = "This is a test file\nTesting 1,2,3..";
$tempHandle = fopen('php://temp', 'r+');
fwrite($tempHandle, $contents);
rewind($tempHandle);
ftp_fput($this->ftp, $filename, $tempHandle, FTP_ASCII);
?>
請確保在使用 ftp_put 之前先使用 chdir 切換到遠端目錄,否則 ftp_put 只會返回無法建立檔案的錯誤。執行 chdir 後,您不應該將檔案的完整路徑傳遞給 ftp_put,而只需傳遞 basename(檔名)。有關更多資訊,請參見範例。
範例
<?php
$locpath = 'local_path/resources/js/test.js';
$rempath = 'resources/js/';
$remFile = 'test.js';
ftp_chdir($this->conn_id, $rempath);
ftp_put($this->conn_id, $remFile, $locpath, FTP_BINARY);
?>
這對大多數人來說可能很明顯,但請確保您的串流不是唯寫的。它必須能夠從您的串流讀取才能上傳其內容。
我花了一段時間才弄清楚為什麼我上傳的檔案是 0B,這就是原因。
這是我寫的一個函式,用於將整個目錄複製到 FTP 伺服器資料夾。
function ftp_uploaddirectory($conn_id, $local_dir, $remote_dir)
{
@ftp_mkdir($conn_id, $remote_dir);
$handle = opendir($local_dir);
while (($file = readdir($handle)) !== false)
{
if (($file != '.') && ($file != '..'))
{
if (is_dir($local_dir.$file))
{
ftp_uploaddirectory($conn_id, $local_dir.$file.'/', $remote_dir.$file.'/');
}
else
$f[] = $file;
}
}
closedir($handle);
if (count($f))
{
sort($f);
@ftp_chdir($conn_id, $remote_dir);
foreach ($f as $files)
{
$from = @fopen("$local_dir$files", 'r');
@ftp_fput($conn_id, $files, $from, FTP_BINARY);
}
}
}
範例
$conn_id = @ftp_connect($server);
@ftp_login ($conn_id, $username, $passwort);
ftp_uploaddirectory($conn_id, 'mydirectory/', 'theftpdirectory/');
@ftp_quit($conn_id);
希望對您有所幫助。