You need to enable JavaScript to run this app. PHP调用ftp_put上传文件报错:参数1应为resource却传入boolean问询
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用ftp_put上传文件报错:参数1应为resource却传入boolean问询

错误原因定位

报错的直接原因是ftp_put方法的第一个参数传值错误:

  • ftp_login执行成功后返回的是布尔值true,你将存储登录结果的$login变量传给了ftp_put的第一个入参
  • 但ftp_put要求第一个参数必须是ftp_connect返回的FTP连接资源对象,也就是你代码里的$conn_id变量

除此之外你的代码还存在3个隐藏问题,同样会导致上传失败:

  1. 你注释了move_uploaded_file方法,表单上传的文件默认存储在临时目录,不执行移动操作的话$location路径下不存在目标文件,fopen读取的内容为空
  2. ftp_put的第三个参数要求传入本地文件的路径字符串,你传入的是fopen返回的文件资源对象,参数类型不匹配
  3. 没有开启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 13:18:03