PHP调用ftp_put上传文件报错:参数1应为resource却传入boolean问询
错误原因定位
报错的直接原因是ftp_put方法的第一个参数传值错误:
ftp_login执行成功后返回的是布尔值true,你将存储登录结果的$login变量传给了ftp_put的第一个入参- 但
ftp_put要求第一个参数必须是ftp_connect返回的FTP连接资源对象,也就是你代码里的$conn_id变量
除此之外你的代码还存在3个隐藏问题,同样会导致上传失败:
- 你注释了
move_uploaded_file方法,表单上传的文件默认存储在临时目录,不执行移动操作的话$location路径下不存在目标文件,fopen读取的内容为空 ftp_put的第三个参数要求传入本地文件的路径字符串,你传入的是fopen返回的文件资源对象,参数类型不匹配- 没有开启FTP被动模式,绝大多数公网FTP服务器都要求客户端开启被动模式才能正常传输文件
可行解决方案
核心修改点如下:
- 将
ftp_put的第一个参数替换为$conn_id - 恢复
move_uploaded_file逻辑,确保本地文件存在 - 如果要使用文件资源上传,将
ftp_put替换为ftp_fput;如果要使用本地路径上传,直接传入$location即可 - 登录成功后开启FTP被动模式
- 建议二进制模式传输文件,避免简历类非文本文件损坏
修复后的完整代码:
$location = "uploads/" . $finalCV; // 移动临时文件到本地存储目录 if(move_uploaded_file($_FILES['applCV']['tmp_name'], $location)){ echo "Temporary file moved successfully. "; }else{ echo "Failed to move temporary file. "; die; // 本地文件不存在,后续步骤无需执行 } // 打开本地文件 if($fp = fopen($location, 'r')) echo "File Open Successful. "; else { echo "File Open Unsuccessful. "; die; } // 建立FTP连接 if($conn_id = ftp_connect("some.server")) echo "FTP Connection Established Successfully. "; else { echo "FTP Connection Failed. "; die; } $ftpuser = "wynand"; $ftppasswd = "********"; // FTP登录并开启被动模式 if($login = ftp_login($conn_id, $ftpuser, $ftppasswd)) { echo "FTP Login Successful. "; ftp_pasv($conn_id, true); // 开启被动模式,必加 } else { echo "FTP Login Unsuccessful. "; die; } // 上传文件,这里用ftp_fput适配你现有文件资源逻辑 if(ftp_fput($conn_id, $finalCV, $fp, FTP_BINARY)) { echo "Successfully uploaded CV. "; } else { echo "There was a problem uploading CV. "; } // 销毁资源 fclose($fp); ftp_close($conn_id);
内容的提问来源于stack exchange,提问作者Wynand Becker
相关产品推荐
相关产品推荐

