通过 FTP 上传 PHP - ftp_put() 我不会打开到 x.x.x.x 的连接(仅到 y.y.y.y)

标签 php ftp

我正在尝试使用一台主机通过 FTP 将内容上传到另一台主机。

我不会打开到 172.xxx.xxx.xxx(仅到 54.xxx.xxx.xxx)的连接”甚至不相关,因为我没有连接到那个主持人。这是托管脚本的服务器的 IP 地址。但不是通过 FTP 访问的服务器。

$conn_id = ftp_connect('50.xxx.xxx.xxx');
ftp_pasv($conn_id, true);

$login_result = ftp_login($conn_id, 'user', 'pass');

$file = "http://example.com/filelocation.swf";

if (ftp_put($conn_id, "test.swf", $file, FTP_BINARY)) {
    echo 'File Uploaded'; 
} 
else {
    echo 'Problem with uploading'; 
}

ftp_put() I won't open a connection to 172.xxx.xxx.xxx (only to 54.xxx.xxx.xxx)

此错误中的 IP 地址不会转到我尝试连接的服务器。 ftp_login 连接,没有问题。 (我什至不希望它连接到那些 IP 地址,所以它为什么这么想?)

我可以使用 ftp_mkdir 在服务器上添加一个目录。但是,当我使用 ftp_put 时,它会抛出该错误。

最佳答案

错误信息其实很相关。

这是对 PORT 命令的 Pure-FTPd 错误响应,当客户端要求服务器打开与客户端 IP 地址不同的数据连接(如服务器所见)。所以它是服务器发送的远程错误消息,而不是 PHP 产生的本地错误消息。

问题通常是由于客户端只知道其本地 IP 地址,而不知道外部 IP 地址造成的。


现在,问题是当您要求 PHP 使用被动模式 (ftp_pasv) 连接时,为什么 PHP 使用 PORT

这显然是因为您甚至在登录之前调用了 ftp_pasv

因此服务器拒绝 PASV 调用:

530 You aren't logged in

不幸的是,PHP 不会传播来自 PASV 调用的错误消息。它会默默地退回到默认的事件模式。您可以通过其返回值(您不检查)来判断调用失败。


只需将 ftp_pasv 调用移到 ftp_login 之后。

$conn_id = ftp_connect('50.xx.xx.xx');

ftp_login($conn_id, 'user', 'pass');

ftp_pasv($conn_id, true);

The documentation明确表示:

Please note that ftp_pasv() can only be called after a successful login or otherwise it will fail.


当然,您应该进行更好的错误检查。


对于类似的问题(仅针对 ProFTPd),请参阅:
PHP ftp_put returning "Unable to build data connection: Connection refused"

关于通过 FTP 上传 PHP - ftp_put() 我不会打开到 x.x.x.x 的连接(仅到 y.y.y.y),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31819695/

相关文章:

PHP通过FTP下载整个文件夹(递归)

java - "hangs"上的 FTP 连接 "LIST"

php - SQL 计算个人最佳表中所有时间记录中保存的记录

php - undefined variable PHP_SELF

php - 如何检测用户是否已登录 symfony?

php - 在 MySQL 结果中搜索的最佳实践

php - 如何在MYsql中存储复选框?

php - 尝试从仅支持主动模式的 EC2 访问 FTP

用于连接到 FTP 和下载文件的 Python 2.5 脚本

c# - 使用 FtpWebRequest 查找 FTP 服务器的子文件夹