使用ftp_nb_put将文件上载到PHP中的FTP服务器会导致目标文件为空

时间:2017-12-04 07:45:42

标签: php ftp

你好, 我正在做一个脚本,通过ftp协议将文件直接发送到服务器。 为此,我使用php ftp函数。

$conn_id = ftp_connect('XXXX.com', 21);

$login_result = ftp_login($conn_id, 'USER_XXXX', 'PWD_XXXX');
ftp_pasv($conn_id, true) or die("Cannot switch to passive mode");

if ((!$conn_id) || (!$login_result)) {
    die("Problem FTP connection !");
}

if (ftp_chdir($conn_id, 'SERVER_PATH')) {
    echo ftp_pwd($conn_id) . "\n";
} else {
    echo "Problem to change path\n";
}

ftp_nb_put($conn_id, $File, $localPath. $File, FTP_ASCII);


ftp_close($conn_id);

没有错误宣布,但到达我服务器的文件是空的。

我忘了准确,我上传的文件是一个很大的xlsx文件。

1 个答案:

答案 0 :(得分:1)

你的代码是错的。您使用非阻止ftp_nb_put,就像它阻止一样。

如果您想要一个简单的代码,则必须使用ftp_put

如果您确实需要非阻止代码,则必须在ftp_nb_continue报告FTP_FINISHED后才能关闭连接。请参阅File uploaded with ftp_nb_put to FileZilla FTP server in PHP is corrupted

否则,您当前的代码只会在上传几乎没有开始时关闭连接。

评论中建议的" sleep"(仅在那里提到)仅用于测试,您无法在真实代码中可靠地使用它。

您的第二个问题是您正在以text / ascii模式(.xlsx)上传二进制FTP_ASCII文件。您必须使用二进制模式(FTP_BINARY)。 text / ascii模式将破坏二进制文件。所以即使上传完成,文件也会被破坏。

这将有效:

ftp_put($conn_id, $File, $localPath.$File, FTP_BINARY);