当我尝试使用PHP的ftp_put函数上传文件时,之前发生了错误:
Warning: ftp_put() [function.ftp-put]: No data connection
现在,我试图将被动模式放在:
ftp_pasv($conn_id, true);
然后出现错误:
Warning: ftp_put() [function.ftp-put]: Type set to I. in
ftp_login已正确完成并且说成功。
现在它发出新警告:警告:ftp_put() [function.ftp-put]: abc.txt: Cannot open or remove a file containing a running program.
任何想法,为什么文件不转移?
谢谢!
这是我的代码段:
$conn_id = ftp_connect($ftp_server) or die("Couldn't connect to $ftp_server");
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass) or die("You do not have access to this ftp server!");
if ((!$conn_id) || (!$login_result)) {
// wont ever hit this, b/c of the die call on ftp_login
echo "<span style='color:#FF0000'><h2>FTP connection has failed! <br />";
echo "Attempted to connect to $ftp_server for user $ftp_user_name</h2></span>";
exit;
} else {
//echo "Connected to $ftp_server, for user $ftp_user_name <br />";
}
//turn passive mode on
ftp_pasv($conn_id, true);
$upload = ftp_put($conn_id, $destination_file.$name, $filename, FTP_BINARY);
if (!$upload) {
echo "<span style='color:#FF0000'><h2>FTP upload of $filename has failed!</h2></span> <br />";
} else {
echo 'Uploaded';
}
ftp_close($conn_id);
答案 0 :(得分:14)
$resource = ftp_connect('ftp.example.com');
ftp_login($resource, 'username', 'password');
# set this to true
ftp_pasv($resource, true);
ftp_get(...);
ftp_put(...);
我收到了相同(不是非常具有描述性)的错误消息E_WARNING ftp_get(): Type set to I.
。
我发现这是因为运行PHP的服务器没有可见的公共IP(它是我工作站上的虚拟服务器)。
解决方案是使用被动模式。默认设置(活动模式)在实时服务器上没有问题,因为实时服务器具有可见的公共IP。
答案 1 :(得分:3)
您看到的最后一个错误发生在FTP守护程序停止打开上传文件并等待您写入时。
无论何时通过FTP服务器成功打开连接,都应准备好在进程完成时关闭与以下函数的连接,或者由于任何错误而终止。
ftp_close($conn_id);
你的脚本可能会打开它的连接,FTP服务器也会因此而感到困惑。尝试在适当的位置添加ftp_close,看看脚本是否运行得更顺畅。
答案 2 :(得分:3)
我尝试在PHP中使用ftp函数,发现使用file_put_contents()
更容易,如下所示:
$remote_file = "ftp://username:password@host.com/path/to/file.txt";
file_put_contents($remote_file, $file_contents);
你仍然可以检查它是否成功以及当然所有好东西。
答案 3 :(得分:0)
你的ftp设置看起来没问题,尝试将文件名$ destination_file。$ name放在一个变量中,转储变量并确保该文件存在绝对路径(如果它与脚本不在同一个文件夹中)。这是我在快速浏览中看到的唯一细节,可能会阻止您的上传。
确保您的文件未在编辑器中打开!如果文件是.txt,你可以使用FTP_ASCII,虽然二进制不应该导致问题。
好运!
答案 4 :(得分:0)
我发现它的解决方案如下:
我刚刚谈到了EUKHOST服务器支持
主要观点是支持人员现在在服务器上为FTP打开了passive port
范围,他告诉我们现在尝试FTP上传。如果您可以尝试使用一些测试文件并且它已成功完成..
答案 5 :(得分:0)
打开 /etc/vsftpd.conf 并添加 pasv_promiscuous = YES ___最后。