PHP 通过 FTP 上传 - ftp_put() 我不会打开 x.x.x.x 的连接(仅 y.y.y.y)
PHP upload via FTP - ftp_put() I won't open a connection to x.x.x.x (only to y.y.y.y)
我正在尝试使用一台主机通过 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
命令的纯 FTPd 错误响应,当客户端要求服务器打开与客户端 IP 地址不同的数据连接(如服务器所见)。所以这是服务器发送的远程错误信息,而不是PHP.
产生的本地错误信息
问题通常是由于客户端只知道其本地 IP 地址,而不知道外部 IP 地址。
现在,问题是当您要求它使用被动模式 (ftp_pasv
) 连接时,为什么 PHP 使用 PORT
。
这显然是因为您甚至在登录之前就调用了 ftp_pasv
。
因此服务器拒绝 PASV
调用:
530 You aren't logged in
不幸的是,PHP 不会传播来自 PASV
调用的错误消息。它会默默地退回到默认的活动模式。您可以通过其 return 值(您不检查)来判断调用失败。
只需将 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),请参阅:
如果您仍有问题并要添加到 Martin Prikryl's 答案,请尝试在连接之前和连接之后调用 ftp_pasv
。
我正在尝试使用一台主机通过 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
命令的纯 FTPd 错误响应,当客户端要求服务器打开与客户端 IP 地址不同的数据连接(如服务器所见)。所以这是服务器发送的远程错误信息,而不是PHP.
问题通常是由于客户端只知道其本地 IP 地址,而不知道外部 IP 地址。
现在,问题是当您要求它使用被动模式 (ftp_pasv
) 连接时,为什么 PHP 使用 PORT
。
这显然是因为您甚至在登录之前就调用了 ftp_pasv
。
因此服务器拒绝 PASV
调用:
530 You aren't logged in
不幸的是,PHP 不会传播来自 PASV
调用的错误消息。它会默默地退回到默认的活动模式。您可以通过其 return 值(您不检查)来判断调用失败。
只需将 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),请参阅:
如果您仍有问题并要添加到 Martin Prikryl's 答案,请尝试在连接之前和连接之后调用 ftp_pasv
。