You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ftp_put返回false,图片无法正常上传至FTP服务器的问题求助

问题分析与解决方案

核心问题原因

  1. 源文件路径错误:你使用$_FILES["img"]["name"]作为ftp_put的源文件路径,这个值只是客户端上传文件的原始文件名,并非服务器上实际存储上传文件的路径。服务器接收上传文件后,会将其暂存在临时目录中,真实路径是$_FILES["img"]["tmp_name"],直接用文件名会导致ftp_put找不到源文件,上传失败。

  2. 传输模式错误:图片属于二进制文件,你使用FTP_ASCII模式传输会破坏文件结构。ASCII模式会自动转换换行符,仅适用于文本文件,二进制文件必须使用FTP_BINARY模式,否则上传后的文件会损坏,表现为大小异常(如1KB空文件)。

修正后的代码

<?php
$ftpHost = "hostsite.com";
$ftpUsername = "username";
$ftpPassword = "password";
$ftpDir = "/host-directory/Orders/images/";

// 先检查上传是否有错误
if ($_FILES["img"]["error"] !== UPLOAD_ERR_OK) {
    echo "文件上传出错:错误码 " . $_FILES["img"]["error"];
    exit;
}

$srcFile = $_FILES["img"]["tmp_name"];
// 保留客户端文件名作为目标文件名
$dstFile = $ftpDir . $_FILES["img"]["name"];

// 连接FTP服务器
$ftpcon = ftp_connect($ftpHost) or die('连接FTP服务器失败...');
$ftplogin = ftp_login($ftpcon, $ftpUsername, $ftpPassword);
ftp_pasv($ftpcon, true) or die("无法切换到被动模式");

if ((!$ftpcon) || (!$ftplogin)) {
    echo "FTP连接失败!<br>";
    exit;
} else {
    echo "连接成功<br>";
}

// 使用二进制模式上传临时文件
if (ftp_put($ftpcon, $dstFile, $srcFile, FTP_BINARY)) {
    echo $dstFile . ' 成功上传到FTP服务器!';
} else {
    echo '上传 ' . $dstFile . ' 失败<br>请稍后重试。';
}

ftp_close($ftpcon);
?>

额外调试建议

  • 打印$_FILES数组,确认上传文件的详细信息:
    print_r($_FILES["img"]);
    
  • 检查FTP目标目录的权限,确保你的FTP账号拥有写入权限。
  • 确认服务器临时目录(upload_tmp_dir)的权限,确保PHP进程能读取临时文件。
  • 可以尝试先将临时文件复制到当前脚本目录,验证文件是否正常:
    copy($_FILES["img"]["tmp_name"], "./test.png");
    

内容的提问来源于stack exchange,提问作者genese

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:05:23