PHP FTP上传报错:无法打开随机临时文件路径求助
解决FTP上传时临时文件找不到的问题
我来帮你排查这个上传失败的问题,错误提示里的临时文件路径是PHP处理上传时自动生成的,出现“Can't open that file”通常和文件权限、临时文件生命周期或者FTP配置有关,咱们一步步来解决:
可能的原因与解决方案
1. 检查临时文件目录的权限
LAMPP的临时文件目录/opt/lampp/temp/需要让PHP运行进程(一般是www-data用户)有读取权限。你可以通过终端命令查看权限:
ls -l /opt/lampp/temp/
如果权限不对,执行以下命令调整:
sudo chown -R www-data:www-data /opt/lampp/temp/ sudo chmod 755 /opt/lampp/temp/
2. 避免临时文件被提前清理
PHP默认会在脚本执行结束后自动删除上传的临时文件,如果你的脚本在ftp_put之前有耗时操作,或者服务器的临时文件清理机制触发过快,就会导致文件找不到。建议先把临时文件复制到自定义目录,再上传:
修改你的PHP代码如下:
$ftp_server = "xxxxxxxxxxxxxx"; $ftp_username = "xxxxxxxxxxxxxxxxxxxxxxx"; $ftp_userpass = "xxxxxxxx"; $ftp_conn = ftp_connect($ftp_server) or die("Could not connect to $ftp_server"); $login = ftp_login($ftp_conn, $ftp_username, $ftp_userpass); // 复制临时文件到当前目录(加唯一ID避免重名) $temp_file = $_FILES['file']['tmp_name']; $file_name = $_FILES['file']['name']; $local_copy = "./temp_upload_" . uniqid() . "_" . $file_name; if (!copy($temp_file, $local_copy)) { die("无法复制临时文件,请检查权限"); } // 确保远程目录存在 $remote_dir = "/uploaded/"; if (!ftp_chdir($ftp_conn, $remote_dir)) { // 目录不存在则创建 if (!ftp_mkdir($ftp_conn, $remote_dir)) { die("无法创建远程目录 $remote_dir,请检查FTP权限"); } } $remote_file = $remote_dir . $file_name; // 用二进制模式上传(适合所有文件类型) if (ftp_put($ftp_conn, $remote_file, $local_copy, FTP_BINARY)) { echo "文件 $file_name 上传成功!"; // 上传完成后删除本地临时副本 unlink($local_copy); } else { echo "文件 $file_name 上传失败,请检查FTP配置"; unlink($local_copy); } ftp_close($ftp_conn);
这里有两个关键调整:
- 把
FTP_ASCII改成FTP_BINARY:ASCII模式仅适用于纯文本文件,二进制模式支持所有类型文件(图片、压缩包等),避免文件损坏或上传失败。 - 复制临时文件到本地目录:确保上传时文件存在,不会被PHP提前清理。
3. 检查FTP服务器的远程目录权限
错误也可能是远程FTP服务器上的/uploaded/目录不存在,或者你的FTP用户没有写入权限。可以用FTP客户端手动登录,确认目录存在且有写入权限,或者用上面代码里的ftp_mkdir自动创建目录。
4. 验证PHP的临时文件配置
你可以在脚本里添加phpinfo()查看PHP的临时文件配置:
phpinfo();
找到upload_tmp_dir项,确认路径是/opt/lampp/temp/,且该目录存在、权限正确。如果路径错误,修改php.ini文件后重启LAMPP服务。
内容的提问来源于stack exchange,提问作者Filip Guzdek




