ftp_put返回false,图片无法正常上传至FTP服务器的问题求助
问题分析与解决方案
核心问题原因
源文件路径错误:你使用
$_FILES["img"]["name"]作为ftp_put的源文件路径,这个值只是客户端上传文件的原始文件名,并非服务器上实际存储上传文件的路径。服务器接收上传文件后,会将其暂存在临时目录中,真实路径是$_FILES["img"]["tmp_name"],直接用文件名会导致ftp_put找不到源文件,上传失败。传输模式错误:图片属于二进制文件,你使用
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
相关产品推荐
相关产品推荐

