PHP Conference Japan 2024

ftp_fput

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

ftp_fput從開啟的檔案上傳到 FTP 伺服器

說明

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

ftp_fput() 會將檔案指標中的資料上傳到 FTP 伺服器上的遠端檔案。

參數

ftp

一個 FTP\Connection 實例。

remote_filename

遠端檔案路徑。

stream

本地檔案上已開啟的檔案指標。讀取會在檔案結尾處停止。

mode

傳輸模式。必須是 FTP_ASCIIFTP_BINARY

offset

開始上傳到遠端檔案中的位置。

返回值

成功時返回 true,失敗時返回 false

更新日誌

版本 說明
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_put() - 將檔案上傳到 FTP 伺服器
  • ftp_nb_fput() - 將開啟檔案中的檔案儲存到 FTP 伺服器(非阻塞)
  • ftp_nb_put() - 在 FTP 伺服器上儲存檔案(非阻塞)

新增註解

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

roy at user dot nl
11 年前
若要直接將內容插入 FTP 主機上的檔案,您也可以建立一個字串串流,直接串流到 ftp_fput 函式。

這樣做應該比先寫入任何本地暫存目錄再進行串流的負擔更小,如同這裡建議的。

<?php

$string
= "Your content goes here";
$stream = fopen('data://text/plain,' . $string,'r');

ftp_fput($this->connection,$pathTo,$stream, FTP_BINARY);

?>
timgolding_10 at hotmail dot com
15 年前
如果在使用 fput 時,您遇到以下錯誤之一:

警告:ftp_fput() [function.ftp-fput]: 開啟 ASCII 模式資料連線

警告:ftp_fput() [function.ftp-fput]: 開啟 BINARY 模式資料連線

而且它在正確的位置建立了檔案,但檔案大小為 0kb,且之後的所有 FTP 指令都失敗。這很可能是因為客戶端位於防火牆後方。要解決此問題,請使用

<?php
ftp_pasv
($resource, true);
?>

在執行任何 put 指令之前。我花了很長時間才弄清楚這一點,當我解決時,我真的歡呼了 :D
jopi paranoid fi
16 年前
當您的檔案內容是字串時,請建立暫存串流並將其用作檔案控制代碼。

<?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);

?>
rok dot meglic at gmail dot com
16 年前
請確保在使用 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);
?>
php at cpis dot me
12 年前
這對大多數人來說可能很明顯,但請確保您的串流不是唯寫的。它必須能夠從您的串流讀取才能上傳其內容。

我花了一段時間才弄清楚為什麼我上傳的檔案是 0B,這就是原因。
jevin
13 年前
您可能還需要注意的是,ftp_fput 會覆蓋任何現有的檔案。
robert b
16 年前
使用 jopi paranoid fi 的例子,tmpfile() 適用於 PHP 4 和 5,而不是使用 php://temp 檔案。
Charlie Brown
16 年前
如果目標檔案存在,則會失敗。先刪除它就會成功。
info at daniel-marschall dot de
18 年前
這是我寫的一個函式,用於將整個目錄複製到 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);

希望對您有所幫助。
darian lassan at yahoo de
21 年前
如果您想傳遞一個包含檔名的字串作為來源而不是資源控制代碼,請改用 ftp_put()。這點很簡單,但這裡沒有提到。
To Top