ftp_nb_fput传输的字节数不超过4096


ftp_nb_fput not transferring more than 4096 bytes

我正试图用ftp_nb_fput将文件上传到服务器,只是它从文件上传的字节数不超过4096,文件大约有700kb。

$connection_to = ftp_connect($host_to);
$ftp_to = ftp_login($connection_to, $user_to, $pass_to);
$fp = fopen($directory_to_move_files.$file_to_move, 'r');
ftp_nb_fput($connection_to, $file_to_move, $fp,  FTP_ASCII);
ftp_close($connection_to);

我感兴趣的是使用这个函数,而不是file_put_contents或CURL。我没有犯任何错误。

使用ftp 中的ftp_nb_put函数时,需要考虑两件事

  1. 它是异步工作的,所以它使用块来工作,这意味着

    ftp_nb_put($my_connection,"test.remote","test.local",ftp_BINARY);

只会导致上传一小段数据,并且从ftp_nb_put函数返回的标志FTP_MOREDATA出现,因此要使用此命令完成上传,您需要迭代:

$ret = ftp_nb_put($my_connection, "test.remote", "test.local", FTP_BINARY);
while ($ret == FTP_MOREDATA) {
   $ret = ftp_nb_continue($my_connection);
}
  1. 有以下指令需要考虑,以便您可以上传大尺寸的文件,这些指令位于php.ini中,不能从当前脚本中修改:

上载文件的最大允许大小。upload_max_filesize=XXM

必须大于或等于upload_max_filesizepost_max_size=XXM

其中XX是Mb的数目。不要忘记放M,在任何修改之后,都需要重新启动服务器。

如果您想一次传输整个文件,请使用ftp_put(),而不是ftp_nb_fput()。它会让你的代码变得简单一点:

$connection_to = ftp_connect($host_to);
$ftp_to = ftp_login($connection_to, $user_to, $pass_to);
$local_file = $directory_to_move_files . $file_to_move;
ftp_put($connection_to, $file_to_move, $local_file,  FTP_BINARY);
ftp_close($connection_to);

附带说明:除非您绝对确定要传输的文件是纯文本,否则不要使用FTP_ASCII。它将损坏二进制文件,包括图像。使用FTP_BINARY总是安全的。