PHP 大会日本 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 个注释

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']);
}
?>
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;
}
}
?>
mike at eastghost dot com
11年前
如果您在防火墙后面并且遇到奇怪的超时、文件创建但现在本地数据保存等问题,则可能需要使用 ftp_pasv()。
lionskape at gmail dot com
7年前
如果您使用的是带有 cp1251 编码的 Windows ftp 服务器,则文件名/路径中的俄语“я”会存在一些问题。

php 使用 telnet 连接 ftp 服务器,并且 telnet 协议中存在代码为 255 的特殊符号。您可以尝试使用 ftp_raw($connection, 'OPTS UTF8 ON'); 并使用 utf-8 工作(如果服务器提供)。

附注:抱歉我的英语不好
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;
}
rodrigo-rocha at oi dot net dot br
22年前
如果您仅向函数的第二个参数提供文件名,则 ftp_get 将打开指向本地文件的指针,创建它并写入它。如果您的服务器执行时间不长并且您没有获取太多文件,则可以。但是,如果您执行太多次,则由 ftp_get 创建的指针将不会关闭,并且会用尽服务器上的打开文件容量,使其无法再打开任何文件,直到您重新启动它。
To Top