PHP FTP上传失败提示无法打开数据连接,求助排查问题
FTP传输报错:ftp_put(): Can't open data connection for transfer of "/server.txt"
问题描述
尝试用PHP传输文件时,持续出现以下错误:
Warning: ftp_put(): Can't open data connection for transfer of "/server.txt"
通过FTP应用(如WinSCP)可正常访问服务器、创建并传输文件,但PHP执行相同操作失败。
我的PHP代码
$serverFile = "server.txt"; $localfile = "/var/sites/store/publish/store-201908-1323-rev9286/www/text.txt"; $localfile = "text.txt"; //Connect to ftp $ftp_server = "111.111.111.11"; $ftp_user_name = "username"; $ftp_user_pass = "password"; /*set up basic ssl connection*/ $ftp = ftp_ssl_connect($ftp_server); // login with username and password $login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass); ftp_pasv($ftp, true); if($login_result){ if (ftp_put($ftp, $serverFile, $localfile, FTP_ASCII)) { Mage::log("successfully uploaded ",null,"ftp.log"); } } ftp_close($ftp);
补充信息
- 无法修改FTP服务器配置,但之前通过远程方式成功上传过文件
- WinSCP使用**FTP over TLS/SSL(显式)**模式连接
- 尝试过指定端口、先在服务器创建文件再用
ftp_get,结果均相同
可能的解决方案
1. 重新协商被动模式连接
部分FTP服务器在登录后需要重新触发被动模式协商,可尝试先关闭再开启被动模式:
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass); // 强制重新协商被动模式连接 ftp_pasv($ftp, false); ftp_pasv($ftp, true);
2. 显式指定FTP端口
显式FTP over TLS默认使用21端口,若服务器有自定义端口,需在连接时指定:
// 替换为服务器实际使用的端口,通常为21 $ftp = ftp_ssl_connect($ftp_server, 21);
3. 确认本地文件路径有效性
代码中$localfile被覆盖为相对路径,需确保该路径在PHP脚本执行的当前工作目录下存在:
$localfile = "text.txt"; if (!file_exists($localfile)) { die("本地文件不存在:".$localfile); }
4. 切换传输模式为二进制
部分服务器对ASCII模式的兼容性较差,尝试使用二进制模式传输:
if (ftp_put($ftp, $serverFile, $localfile, FTP_BINARY))
5. 启用FTP调试日志
开启调试模式获取更详细的错误信息,帮助定位问题:
// 开启全部错误输出 error_reporting(E_ALL); ini_set('display_errors', 1); // 设置FTP超时并启用调试 ftp_set_option($ftp, FTP_TIMEOUT_SEC, 30); ftp_set_option($ftp, FTP_DEBUG, 3);
6. 检查PHP环境的SSL扩展支持
确认PHP配置中已启用OpenSSL扩展(extension=openssl),否则ftp_ssl_connect无法正常工作。
内容的提问来源于stack exchange,提问作者Natalie Hedström
相关产品推荐
相关产品推荐

