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

时间:2015-08-04 21:30:44

标签: 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()我不会打开到172.xxx.xxx.xxx的连接(仅限54.xxx.xxx.xxx)

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

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

2 个答案:

答案 0 :(得分:17)

错误信息实际上非常相关。

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

问题通常是由客户端只知道其本地IP地址而不是外部IP地址引起的。

现在,问题是当你要求它使用被动模式(PORT)进行连接时,PHP使用ftp_pasv的原因。

很明显,因为您在登录之前就致电ftp_pasv

因此,服务器拒绝PASV来电:

  

530您尚未登录

不幸的是,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清楚地表明了这一点:

  

请注意,ftp_pasv()只能在成功登录后调用,否则将失败。

当然,你应该做一个更好的错误检查。

答案 1 :(得分:0)

如果您仍然遇到问题并要添加到Martin Prikryl's答案中,请尝试在连接之前和连接之后也致电ftp_pasv