PHP ftp_get()连接正常但无法下载文件问题求助
我通过二维码匹配订单商品与带相同二维码的个性化印刷内容,避免发错货。之前一直用FileZilla手动将二维码图片下载到工作电脑,现在尝试用PHP脚本自动化这个流程。脚本能成功连接FTP服务器、查看目录文件、修改文件权限,但调用ftp_get()时显示下载成功,本地指定路径却找不到对应的.png文件。网站部署在Hostgator服务器,运行PHP 7.4,为什么FileZilla能正常下载,但脚本不行?
<?PHP //ERROR REPORTING ON, NO ERRORS SHOW AT ALL error_reporting(E_ERROR | E_WARNING | E_PARSE); $qrcodigo1="3574975711.png"; // 要传输的文件名 $source_file = "$qrcodigo1"; // 赋值给源文件字符串 $destination_file = "C:\Users\*USER*\*MAIN-FOLDER-1*\*SUB-FOLDER-1*\*SKU-FOLDER1*\*PRODUCT-FOLDER1*\*PRODUCT-CODE-FOLDER"; // 我想要保存到本地电脑的路径 $ftp_server = "ftp.XXXXXXXXXX.co.uk"; // FTP服务器地址 $ftp_user_name = "XXXXXX"; // 用户名 $ftp_user_pass = "XXXXXXXXXXXXXXXX"; // 密码 // FTP连接,能成功连接 $ftp = ftp_connect($ftp_server); $login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass); ftp_pasv($ftp, true); // 设置被动模式避免问题 if ((!$ftp) || (!$login_result)) { die("FTP connection has failed !"); } // 通过列出目录内容确认连接成功 - 正常工作 ftp_chdir($ftp, "XXX/XXXXXXXX"); echo "Connected - Current directory is now:".ftp_pwd($ftp)."<br><br>"; $file_list = ftp_nlist($ftp, "."); var_dump($file_list); echo "<br><br>"; // 修改文件权限确认权限正常 - 正常工作 if (ftp_chmod($ftp, 0777, $source_file) !== false) { echo "Successfully chmoded $source_file to 777.<br><br>"; } else { echo "chmod failed.<br><br>"; } // 从服务器下载到本地电脑,显示下载成功但找不到文件? // 屏幕输出:"Successfully downloaded 3574975711.png to C:\Users\*USER*\*MAIN-FOLDER-1*\*SUB-FOLDER-1*\*SKU-FOLDER1*\*PRODUCT-FOLDER1*\*PRODUCT-CODE-FOLDER" // 文件在哪?文件夹里没有? if (ftp_get($ftp, $destination_file, $source_file, FTP_BINARY)) { echo "Successfully downloaded $source_file to $destination_file <br>"; } else { echo "There was a problem while downloading $source_file <br>"; } // 关闭连接 ftp_close($ftp); ?>
运行环境混淆(最关键):你的PHP脚本部署在Hostgator服务器上,运行环境是服务器的操作系统,而非你本地工作电脑。
ftp_get()是将FTP服务器上的文件下载到运行脚本的Hostgator服务器文件系统中,不是你本地的C盘路径。你指定的C:\Users\...路径是服务器端的路径(Hostgator一般是Linux服务器,该路径大概率不存在),文件要么被写入服务器的异常位置,要么因路径无效被静默处理,所以本地找不到。- 解决方向:
- 在本地电脑搭建PHP环境,运行脚本直接下载到本地;
- 让服务器脚本将文件下载到服务器的可访问目录,再通过浏览器或FTP工具从服务器转存到本地。
- 解决方向:
目标路径不完整:你指定的
$destination_file只有文件夹路径,未包含文件名。ftp_get()需要完整的文件路径(文件夹+文件名),否则PHP无法确定要创建的文件,可能导致文件写入错误位置或无法生成。- 修正示例:
$destination_file = "C:\Users\*USER*\*MAIN-FOLDER-1*\*SUB-FOLDER-1*\*SKU-FOLDER1*\*PRODUCT-FOLDER1*\*PRODUCT-CODE-FOLDER\3574975711.png";
- 修正示例:
路径转义问题:Windows路径中的反斜杠
\在PHP字符串中是转义字符,需用双反斜杠\\或正斜杠/替代,否则路径会被解析错误。- 修正示例:
$destination_file = "C:/Users/*USER*/MAIN-FOLDER-1/SUB-FOLDER-1/SKU-FOLDER1/PRODUCT-FOLDER1/PRODUCT-CODE-FOLDER/3574975711.png";
- 修正示例:
错误报告限制:你设置的
error_reporting(E_ERROR | E_WARNING | E_PARSE)屏蔽了部分错误信息(如路径不存在、权限不足的通知),可临时改为error_reporting(E_ALL); ini_set('display_errors', 1);查看完整错误,辅助定位问题。
内容的提问来源于stack exchange,提问作者Sweets-n-Stuff

