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

问题描述 投票:2回答:1

您好,我正在做一个脚本,通过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文件。

php ftp
1个回答
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

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

评论中提出的“睡眠”(仅在那里提到)仅用于测试,您无法在实际代码中可靠地使用它。


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


这将有效:

ftp_put($conn_id, $File, $localPath.$File, FTP_BINARY);
© www.soinside.com 2019 - 2024. All rights reserved.