php的ftp打开数据连接失败

今天一看广州海关的文档瞬间之前看的接口文档都不是问题,广州海关的文档那个才是问题啊!说了一堆怎么定制报文格式,然后就没有然后了,可你得告诉我怎么发送报文,发送到那里?文档只字不写,坑!然后又得去问海关的人要,卧槽,广州海关那边接口太特么强大,给一个地址,用户名,密码 ,用ftp上传xml文档,瞬间觉得这种接口高大上,第一次用过这样的接口,太特么给力,给广州海关点32个赞

测试代码

$conn_id = ftp_connect($ftp_server,$ftp_port) or die("Couldn't connect to $ftp_server");

if (@ftp_login($conn_id, $ftp_user, $ftp_pass)) {  
    echo "Connected as $ftp_user@$ftp_server\n";
} else {
    echo "Couldn't connect as $ftp_user\n";
}

//切换目录
ftp_chdir($conn_id,'UPLOAD');

//保存报文
$file = md5('订单号');


//上传海关
$ret = ftp_nb_put($conn_id, "test.remote", $file, FTP_BINARY);
while ($ret == FTP_MOREDATA) {

    // 在这里可以加入其它代码
    echo "异步执行代码哈哈哈哈哈哈哈.\n";

    // 继续传送...
    $ret = ftp_nb_continue ($conn_id);
}

if ($ret != FTP_FINISHED) {  
    echo "上传文件中发生错误...";
    exit(1);
}


echo '传送完成';

// 关闭连接
ftp_close($conn_id);  

PHP警告提示

Warning: ftp_nb_put(): Opening BINARY mode data connection for test.remote  

解决方式 在登录成功之后加入ftppasv($connid, true);,打开ftp被动模式即可

原因分析

FTP连接分析

1、主动FTP:  
            命令连接:客户端 >1024端口 -> 服务器 21端口  
            数据连接:客户端 >1024端口 <- 服务器 20端口 
 2、被动FTP: 
            命令连接:客户端 > 1024端口 -> 服务器 21端口 
            数据连接:客户端 > 1024端口 -> 服务器 > 1024端口

php默认是使用主动的,因此在数据传输的时候服务器端未能打开连接本地客户端,而造成数据传输失败,因此看到服务器端文件也为0个字节

你的欣赏是我最大的动力

Yanxiong Huang

My name is Yanxiong Huang. graduated from Nanyang middle school.Love Linux,familiar with Node.js,Docker,Serverless... and more Web technology.Contact Me:QQ 31356617;Email:huangaynxiong2013@gmail.com

guangzhou,china http://www.myfreax.com

乐在分享