FTP 函数

目录

  • ftp_alloc — 分配要上传的文件的空间
  • ftp_append — 将文件内容追加到 FTP 服务器上的另一个文件
  • ftp_cdup — 更改到父目录
  • ftp_chdir — 更改 FTP 服务器上的当前目录
  • ftp_chmod — 通过 FTP 设置文件权限
  • ftp_close — 关闭 FTP 连接
  • ftp_connect — 打开 FTP 连接
  • ftp_delete — 删除 FTP 服务器上的文件
  • ftp_exec — 请求在 FTP 服务器上执行命令
  • ftp_fget — 从 FTP 服务器下载文件并保存到打开的文件
  • ftp_fput — 将内容从打开的文件上传到 FTP 服务器
  • ftp_get — 从 FTP 服务器下载文件
  • ftp_get_option — 检索当前 FTP 连接的各种运行时行为
  • ftp_login — 登录到 FTP 连接
  • ftp_mdtm — 返回给定文件的最后修改时间
  • ftp_mkdir — 创建目录
  • ftp_mlsd — 返回给定目录中的文件列表
  • ftp_nb_continue — 继续检索/发送文件(非阻塞)
  • ftp_nb_fget — 从 FTP 服务器检索文件并将其写入打开的文件(非阻塞)
  • ftp_nb_fput — 将文件从打开的文件存储到 FTP 服务器(非阻塞)
  • ftp_nb_get — 从 FTP 服务器检索文件并将其写入本地文件(非阻塞)
  • ftp_nb_put — 将文件存储到 FTP 服务器(非阻塞)
  • ftp_nlist — 返回给定目录中的文件列表
  • ftp_pasv — 打开或关闭被动模式
  • ftp_put — 将文件上传到 FTP 服务器
  • ftp_pwd — 返回当前目录名
  • ftp_quit — ftp_close 的别名
  • ftp_raw — 向 FTP 服务器发送任意命令
  • ftp_rawlist — 返回给定目录中的详细文件列表
  • ftp_rename — 重命名 FTP 服务器上的文件或目录
  • ftp_rmdir — 删除目录
  • ftp_set_option — 设置各种 FTP 运行时选项
  • ftp_site — 向服务器发送 SITE 命令
  • ftp_size — 返回给定文件的大小
  • ftp_ssl_connect — 打开安全的 SSL-FTP 连接
  • ftp_systype — 返回远程 FTP 服务器的系统类型标识符
添加注释

用户贡献的注释 16 个注释

nicklas at programmera dot nu
17 年前
我不太喜欢我的 FTP 程序,因为每次重启客户端时,我都要重新设置所有设置,所以我为简单的 FTP 上传制作了这个脚本,它作为 CLI 应用程序运行。

<?php

// 如果 STDIN 未定义,则定义它
if (!defined("STDIN"))
{

define("STDIN", fopen("php://stdin", "r"));

}

echo
"FTP 文件上传器\r\n\r\n";

echo
"服务器: ";

// trim() 所有 fgets 因为它似乎添加了 \n
$server = trim(fgets(STDIN));

echo
"用户名: ";

$username = trim(fgets(STDIN));

echo
"密码: ";

$password = trim(fgets(STDIN));

$connect = ftp_connect($server);
$login = ftp_login($connect, $username, $password);

if ((!
$connect) || (!$login))
{

exit(
"登录失败。\r\n");

}

echo
"已连接\r\n";

echo
"PASV (Y/任何键 = 关闭): ";

if(
trim(fgets(STDIN)) == "Y")
{

// 启用被动模式
ftp_pasv($connect, true);

echo
"PASV: 打开\r\n";

}
else
{

echo
"PASV: 关闭\r\n";

}

$showContent = ftp_nlist($connect, "");

echo
"列出内容:\r\n";

var_dump($showContent);

echo
"要上传的文件: ";

$file = trim(fgets(STDIN));

// 通过键入 "exit;" 来逃避上传过程
if ($file == "exit;")
{

exit;

}

// 使用 "$file, $file" 因为文件不应重命名,如果它是二进制文件,将最后一个参数更改为 FTP_BINARY
$upload = ftp_put($connect, $file, $file, FTP_ASCII);

if (!
$upload)
{

exit(
"上传失败。\r\n");

}
else
{

echo
"文件 \"" . $file . "\" 上传成功。 :)\r\n\"" . $file . "\": " . filesize($file) / 1024 ."kb.\r\n";
echo
"我的工作完成了,再见。\r\n";

}

ftp_close($connect);

?>
cgray at premierconsulting dot com (Chris Gray)
17 年前
在网上到处寻找 "完全正常工作" 的 FTP 上传脚本之后,我最终通过使用我在网上找到的各种脚本组合出了这个脚本。如果您发现更好的方法,请告诉我。谢谢,享受吧

<?php
if(isset($_POST['SubmitFile'])){
$myFile = $_FILES['txt_file']; // 将存储的文件信息转换为数组。
$file = $myFile['tmp_name']; // 将数组转换为一个新字符串,包含服务器上文件的路径名。

$myFileName = basename($_POST['txt_fileName']); // 从文件路径中检索文件名

$destination_file = "/".$myFileName; // 您想将文件放到网络服务器上的位置(相对于您的登录目录)

// 连接设置
$ftp_server = "127.0.0.1"; // ftp 服务器地址。
$ftp_user_name = "您的用户名"; // 用户名
$ftp_user_pass = "您的密码"; // 密码

$conn_id = ftp_connect($ftp_server); // 建立基本连接
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass) or die("<h2>您没有访问此 ftp 服务器的权限!</h2>"); // 使用用户名和密码登录,或给出无效用户消息
if ((!$conn_id) || (!$login_result)) { // 检查连接
// 永远不会执行这里,因为 ftp_login 中的 die 调用。
echo "FTP 连接失败! <br />";
echo
"尝试连接到 $ftp_server 以用户 $ftp_user_name";
exit;
} else {
// echo "已连接到 $ftp_server,以用户 $ftp_user_name <br />";
}

$upload = ftp_put($conn_id, $destination_file, $file, FTP_BINARY); // 上传文件
if (!$upload) { // 检查上传状态
echo "<h2>FTP 上传 $myFileName 失败!</h2> <br />";
} else {
echo
"正在上传 $myFileName 完成!<br /><br />";
}

ftp_close($conn_id); // 关闭 FTP 流
}
?>

<html>
<head>

</head>
<body>
<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST">
请选择一个文件: <input name="txt_file" type="file" id="txt_file" tabindex="1" size="35" onChange="txt_fileName.value=txt_file.value" />
<input name="txt_fileName" type="hidden" id="txt_fileName" tabindex="99" size="1" />

<input type="submit" name="SubmitFile" value="上传文件" accesskey="ENTER" tabindex="2" />
</form>
</body>
<html>
dot a dot@dot dot com
16 年前
我花了几个小时才弄明白。它是基于下面的代码,我只是添加了一个字符串替换来将 Windows 给出的路径名转换为 Unix 路径名。希望它能节省一些人的时间。享受吧!(此外,还包括删除文件功能:)

<?php
$myFile
= $_FILES['file']; // 将存储的文件信息转换为数组。
$file = $myFile['tmp_name']; // 将数组转换为一个新字符串,包含服务器上文件的路径名。
$myFileName = $_POST['MyFile']; // 检索文件路径和文件名
$myfile_replace = str_replace('\\', '/', $myFileName); // 转换路径以供 unix 使用
$myfile = basename($myfile_replace); // 从路径中提取文件名
$destination_file = "/".$myfile; // 您想将文件放到网络服务器上的位置(相对于您的登录目录)
// 连接设置
$ftp_server = "127.0.0.1"; // ftp 服务器地址(不包含 ftp://)
$ftp_user_name = ""; // 用户名
$ftp_user_pass = ""; // 密码
$conn_id = ftp_connect($ftp_server); // 建立基本连接
// 使用用户名和密码登录,或给出无效用户消息
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass) or die("<h1>您没有访问此 ftp 服务器的权限!</h1>");
$upload = ftp_put($conn_id, $destination_file, $file, FTP_BINARY); // 上传文件
if (!$upload) { // 检查上传状态
echo "<h2>FTP 上传 $myFileName 失败!</h2> <br />";
}
/*
// 尝试删除 $file
if (ftp_delete($conn_id, $destination_file)) {
echo "$destination_file 已删除!\n";
} else {
echo "无法删除 $destination_file!\n";
}
*/
ftp_close($conn_id); // 关闭 FTP 流
}
?>
<form name="form" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST" >
请选择一个文件: <input type="file" name="file" accept="text/plain" onChange="MyFile.value=file.value">
<input name="MyFile" type="hidden" id="MyFile" tabindex="99" size="1" />
<input type="submit" name="submit" value="上传" style="vertical-align:middle"/><br/><br/>
</form>
ras "at" fyn {dot} dk
17 年前
获取远程文件并返回其内容(而不是保存到本地文件)的功能缺失 - 这里就是它

function ftp_fetch($ftp_stream, $remote_file) {
ob_end_flush();
ob_start();
$out = fopen('php://output', 'w');
if (!ftp_fget($ftp_stream, $out, $remote_file, FTP_ASCII)) die('无法获取文件: ' . $remote_file);
fclose($out);
$data = ob_get_clean();
return $data;
}

它与 ftp_get() 的工作方式相同,但它返回远程文件的内容 - 例如

$ftp = ftp_connect('my.server.com', 21, 60);
ftp_login($ftp, 'username', 'password');
$data = ftp_fetch($ftp, 'path/to/remote.file');
echo $data;

注意,我用它从服务器上获取文本文件 - 如果您需要获取二进制文件,请将 FTP_ASCII 更改为 FTP_BINARY .. 但大多数情况下,将文件获取到内存中只对较小的文件有用,例如纯文本、xml 等。
dickiedyce at uk dot com
19 年前
对其他人来说可能很明显,但我被困了将近一个小时!如果您能连接到 ftp 站点,但某些功能(list、put、get 等)不起作用,那么请尝试使用 ftp_pasv 并打开被动模式。

<?php

// 在这里之前设置 $host 和 $file 变量以适合您的设置...

$hostip = gethostbyname($host);
$conn_id = ftp_connect($hostip);

// 使用用户名和密码登录
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// 重要!打开被动模式
ftp_pasv ( $conn_id, true );

if ((!
$conn_id) || (!$login_result)) {
echo
"FTP 连接失败!";
echo
"尝试连接到 $host 以用户 $ftp_user_name";
die;
} else {
echo
"已连接到 $host,以用户 $ftp_user_name<br>";
echo
"主机 IP 为 $hostip<br>";

// 上传文件
if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) {
echo
"已成功上传 $file<br>";
} else {
echo
"上传 $file 时出现问题 <br>";
}

// 关闭连接
ftp_close($conn_id);
}
?>
postmaster at alishomepage dot com
20 年前
我编写了一个开源的 ZIP2FTP 接口,它实际上接受一个给定的 ZIP 文件,并在您指定的 FTP 服务器上的文件夹中解压缩它...

因此,对于对 FTP 感兴趣的人来说,它可能非常有趣,它的地址是 http://zip2ftp.alishomepage.com ; 那些直接想要源代码的人可以访问 http://zip2ftp.alishomepage.com/?do=getSource
Vikrant Korde <vakorde at hotmail dot com>
20 年前
<?

//如果您想将文件夹层次结构从当前服务器移动或复制到另一个远程服务器。那么这将很有帮助,因为它会浏览当前服务器的目录,同时它会将该文件复制到远程服务器的同一目录中。

//此脚本将通过 FTP 将所有文件从该目录及其子目录复制到另一个远程服务器

function rec_copy ($source_path, $destination_path, $con)
{
ftp_mkdir($con, $destination_path);
ftp_site($con, 'CHMOD 0777 '.$destination_path);
ftp_chdir($con,$destination_path);

if (is_dir($source_path))
{
chdir($source_path);
$handle=opendir('.');
while (($file = readdir($handle))!==false)
{
if (($file != ".") && ($file != ".."))
{
if (is_dir($file))
{
//这里我限制了文件夹名称 'propertyimages' 被复制到远程服务器。 -- VK
if($file != "propertyimages")
{
rec_copy ($source_path."/".$file, $file, $con);
chdir($source_path);
ftp_cdup($con);
}
}
if (is_file($file))
{
$fp = fopen($file,"r");
//这会将空格转换为 '_',这样就不会抛出错误。 -- VK
ftp_fput ($con, str_replace(" ", "_", $file), $fp,FTP_BINARY);
ftp_site($con, 'CHMOD 0755 '.str_replace(" ", "_", $file));
}
}
}
closedir($handle);
}
}

//建立 FTP 连接 --VK
$con = ftp_connect("69.18.213.131",21);
$login_result = ftp_login($con,"username","password");

//这是远程服务器的根路径 -- VK
$rootpath = "mainwebsite_html";

//这是源目录的物理路径。实际上你也可以使用相对路径。 -- VK
$sourcepath = realpath("../")."/resdesk";

//这个目录名只会改变最顶层的目录,而不会改变内部的目录 -- VK
$destination_dir_name = "resdesk_".$account_id."/";

rec_copy ($sourcepath, $destination_dir_name, $con);
if (function_exists("ftp_close"))
{
ftp_close($con);
}
?>
NOSPAMkent at ioflux dot NOSPAM dot com
21 年前
我认为其他一些帖子试图说的话可能需要澄清,那就是在 PHP 4.2.3 中,ftp_connect("myhost.com") 大部分时间都会失败,除非它每隔几分钟就能正常工作一次。

解决方法是 ftp_connect 似乎在解析地址时存在错误。如果您执行

$hostip = gethostbyname($host);
$conn_id = ftp_connect($hostip);

似乎解决了这个问题。
(其他用户提到了 ftpbuf() 错误... 不确定是什么,但这应该能解决它。)
Kristy Christie (kristy at isp7 dot net)
20 年前
这里有一个我创建的小函数,它可以在本地目录中递归,并将整个内容上传到远程 FTP 服务器。

在这个例子中,我试图将位于 /home/kristy/scripts/iwm 的整个 "iwm" 目录复制到远程服务器的 /public_html/test/ 通过 FTP。

唯一的问题是,对于 "if (!ftp_chdir($ftpc,$ftproot.$srcrela))" 这行,我用来检查该目录是否已经存在于远程服务器上,它会吐出一个关于无法更改到该目录的警告,如果它不存在的话。

但错误处理程序应该能解决它。

感谢在检索目录中文件列表方面发布了代码片段的那个人。

对于递归和上传时会回显其进度的脚本版本,请访问:http://pastebin.com/73784

<?php

// --------------------------------------------------------------------
// 触发器
// --------------------------------------------------------------------

// 设置各种变量
$ftproot = "/public_html/test/";
$srcroot = "/home/kristy/scripts/";
$srcrela = "iwm/";

// 连接到目标 FTP 并进入本地和远程的相应目录
$ftpc = ftp_connect("ftp.mydomain.com");
$ftpr = ftp_login($ftpc,"username","password");

if ((!
$ftpc) || (!$ftpr)) { echo "FTP 连接未建立!"; die(); }
if (!
chdir($srcroot)) { echo "无法进入本地源根目录。"; die(); }
if (!
ftp_chdir($ftpc,$ftproot)) { echo "无法进入 FTP 根目录。"; die(); }

// 开始递归 FTP 传输目录
ftpRec ($srcrela);

// 关闭 FTP 连接
ftp_close($ftpc);

// --------------------------------------------------------------------
// 实际功能
// --------------------------------------------------------------------
function ftpRec ($srcrela)
{
global
$srcroot;
global
$ftproot;
global
$ftpc;
global
$ftpr;

// 进入要递归遍历的本地目录
chdir($srcroot.$srcrela);

// 检查目录是否存在,并在目标上更改到该目录
if (!ftp_chdir($ftpc,$ftproot.$srcrela))
{
// 远程目录不存在,因此创建并进入它
ftp_mkdir ($ftpc,$ftproot.$srcrela);
ftp_chdir ($ftpc,$ftproot.$srcrela);
}

if (
$handle = opendir("."))
{
while (
false !== ($fil = readdir($handle)))
{
if (
$fil != "." && $fil != "..")
{
// 检查它是一个文件还是目录
if (!is_dir($fil))
{
// 它是一个文件,因此上传它
ftp_put($ftpc, $ftproot.$srcrela.$fil, $fil, FTP_BINARY);
}
else
{
// 它是一个目录,因此递归遍历它
if ($fil == "templates")
{
// 我希望脚本忽略任何名为 "templates" 的目录
// 因此,不要递归遍历它们并上传它们的内容
}
else
{
ftpRec ($srcrela.$fil."/");
chdir ("../");
}
}
}
}
closedir($handle);
}
}
?>
spam at kacke dot de
16 年前
这是一个支持大多数命令的 FTP 抽象类。

它还可以通过使用 stream_crypto_enable() 在 TLS、SSLv2 等上工作。

http://kacke.de/php_samples/source.php?f=ftp.cls.php

经过这么多年,非常感谢 WEZ :-)

Toppi
leonardo at rol dot com dot ro
19 年前
这是一个将远程 FTP 结构下载到本地服务器的示例,这对将网站从一个服务器迁移到另一个服务器很有用,尤其是在你升级 ensim 时 ;)

http://leonardo.rol.ro/ftpleech.txt
sven at cartell-network dot de
22 年前
通过代理连接到 FTP 服务器

$ftp_server = "proxy"; 例如 123.456.789.10
$ftp_user_name = "username@ftpserver"; 例如 [email protected]
$ftp_user_pass = "password";

$conn_id = ftp_connect($ftp_server, 2121);
$login_result = ftp_login( $conn_id, $ftp_user_name, $ftp_user_pass );
postmaster at alishomepage dot com
20 年前
这是另一个通过 PHP 的 FTP 接口(也使用 MySQL)

http://myftp.alishomepage.com

PS:此脚本还允许您下载其源代码... 所以对于你们程序员来说也变得有趣了 :D
arjen at queek dot nl
20 年前
如果您喜欢对 FTP 函数使用面向对象的方法,您可以使用这段代码片段(仅限 PHP5!并会增加一些开销)。这只是一个 "启动",您可以根据需要进行扩展/改进...
您可以将所有 ftp_* 函数传递到您的对象中,并剥离函数名的 ftp_。此外,您不必将 ftp 资源作为第一个参数传递。

例如
<?php
ftp_delete
($ftp, $file); // 其中 $ftp 是您的 ftp 资源
?>

可以变成
<?php
$ftp
->delete($file); // 其中 $ftp 是您的 FTP 对象
?>

代码
<?php

class FTP {

private
$ftp;

/* public Void __construct(): 构造函数 */
public function __construct($host, $port = 21, $timeout = 90) {
$this->ftp = ftp_connect($host, $port, $timeout);
}

/* public Void __destruct(): 析构函数 */
public function __destruct() {
@
ftp_close($this->ftp);
}

/* public Mixed __call(): 将所有函数调用重定向到 PHP 函数 */
public function __call($function, $arguments) {
// 将 FTP 资源添加到参数数组的开头
array_unshift($arguments, $this->ftp);

// 调用 PHP 函数
return call_user_func_array('ftp_' . $function, $arguments);
}

}

?>
breese at pipetech dot tv
17 年前
我修复了下面的上传脚本,使其能够与 Windows 上传配合使用(并更新了一些语法)。我还为那些没有使用 PHP 5.2 的用户添加了一个 Javascript “进度指示器”。

<?php
if(isset($_POST['start_upload']) && $_FILES['txt_file']['name'] != ""){

$local_file = $_FILES['txt_file']['tmp_name']; // 定义要上传的本地文件名称

$destination_file = "/".basename($_FILES['txt_file']['name']); // 文件上传的路径(相对于您的登录目录)

// 全局连接设置
$ftp_server = "127.0.0.1"; // FTP 服务器地址(排除 ftp://
$ftp_user_name = "username"; // FTP 服务器用户名
$ftp_user_pass = "password"; // 密码

// 连接到 FTP 服务器
$conn_id = ftp_connect($ftp_server);
// 登录 FTP 服务器
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// 验证登录状态
if ((!$conn_id) || (!$login_result)) {
echo
"FTP 连接失败! <br />";
echo
"尝试连接到 $ftp_server 用户 $ftp_user_name";
exit;
} else {
echo
"已连接到 $ftp_server,用户 $ftp_user_name <br />";
}

$upload = ftp_put($conn_id, $destination_file, $local_file, FTP_BINARY); // 上传文件

// 验证上传状态
if (!$upload) {
echo
"<h2>FTP 上传 $_FILES['txt_file']['name'] . " 失败!</h2><br /><br />";
} else {
echo
"成功!<br />" . $_FILES['txt_file']['name'] . " 已上传到 " . $ftp_server . $destination_file . "!<br /><br />";
}

ftp_close($conn_id); // 关闭 FTP 连接
}
?>

<html>
<head>
<script type="text/javascript">
window.onload = function() {
document.getElementById("progress").style.visibility = "hidden";
document.getElementById("prog_text").style.visibility = "hidden";
}

function dispProgress() {
document.getElementById("progress").style.visibility = "visible";
document.getElementById("prog_text").style.visibility = "visible";
}

</script>

</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST" enctype="multipart/form-data">
请选择一个文件:<input name="txt_file" type="file" size="35" />
<input type="submit" name="start_upload" value="上传文件" onClick="dispProgress()" />
</form>

<!-- 链接到进度文件:请查看 http://www.ajaxload.info/ 获取动画 gif -->
<img id="progress" src="http://www.your.site/images/progress.gif" />
<p id="prog_text" style="display:inline;"> 上传已开始!</p>

</body>
<html>
magic2lantern at mail dot ru
18 年前
这是一个我写的简单脚本,它允许用户
在控制台中运行它,并从 FTP 服务器获取树结构。

<?php
$argv
= $_SERVER["argv"];
$argv = array_slice($argv,1);
if (
getenv("HTTP_HOST")) {exit("仅供 bash 执行!");}
if ((empty(
$argv[0])) || (empty($argv[1]))) {exit("用法:thisscript.php 10.0.0.10 /games/Arcade/
其中 10.0.0.10 是 FTP 服务器,而 /games/Arcade 是 FTP 上的起始路径\n"
);}

// 连接到 FTP 服务器
$connect_id = ftp_connect($argv[0]);
// 在服务器上登录
if ($connect_id) { $login_result = ftp_login($connect_id, 'anonymous', 'JustForFun'); }
// 检查连接
if ((!$connect_id) || (!$login_result)) {
echo
"无法连接到远程 FTP 服务器!\n";
exit;
}
function
ftp_get_dir ($ftp_dir) {
global
$connect_id;
$ftp_contents = ftp_nlist ($connect_id, $ftp_dir);
for (
$myCounter_for_server_elements = 0; !empty ($ftp_contents[$myCounter_for_server_elements]);
$myCounter_for_server_elements++)
{
// 获取当前目录中的元素列表
echo $argv[0] . $ftp_dir . $ftp_contents[$myCounter_for_server_elements] . "\n";
ftp_get_dir ($ftp_dir . $ftp_contents[$myCounter_for_server_elements] . '/');
}
}
ftp_get_dir ($argv[1]);
// 关闭连接
ftp_close($connect_id);
?>
To Top