【问题标题】:Uploading file with ftp_nb_put to FTP server in PHP results in an empty destination file使用 ftp_nb_put 将文件上传到 PHP 中的 FTP 服务器会导致目标文件为空
【发布时间】:2017-12-04 07:45:42
【问题描述】:

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

【问题讨论】:

  • 试转报错error_reporting(E_ALL);
  • 我做了,出现0个错误
  • 这行ftp_nb_put($conn_id, $File, $localPath. $File, FTP_ASCII);返回什么?
  • 试试ftp_nb_put($conn_id,"fred",...)
  • 这一行返回 2. 'Try ftp_nb_put($conn_id,"fred",...)' 上传 'fred' 和一些内容

标签: php ftp


【解决方案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。

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

cmets 中建议的“睡眠”(如其中所述)仅用于测试,您无法在实际代码中可靠地使用它。


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


这将起作用:

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

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 2013-06-09
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多