使用PHP fopen配合ssh2.sftp:// URI从SFTP下载文件为空如何解决?
问题原因
你提供的代码仅创建了远程SFTP文件的读取流、初始化了本地空白文件,未执行任何内容读取和写入本地的操作,直接关闭了远程流,因此最终得到的本地文件为空。
具体错误点
- 调用
fopen($file, "w")后没有保存本地文件的写入句柄,无法执行后续写入操作 - 缺少从远程流读取内容、写入本地文件的核心逻辑
- 没有加基础错误校验,无法排查连接失败、文件无权限等异常场景
修正后的实现代码
// 建立SSH连接 $connection = ssh2_connect('{你的服务器IP}', 22); if (!$connection) { die('SSH连接失败'); } // 身份校验 if (!ssh2_auth_password($connection, '{用户名}', '{密码}')) { die('SSH身份验证失败'); } // 初始化SFTP资源 $sftp = ssh2_sftp($connection); if (!$sftp) { die('SFTP初始化失败'); } $file = "test.txt"; $remote_path = "ssh2.sftp://$sftp/public_html/$file"; // 打开远程文件可读流 $remote_stream = fopen($remote_path, 'r'); if (!$remote_stream) { die('远程文件打开失败,请检查路径和读取权限'); } // 打开本地文件可写流 $local_stream = fopen($file, 'w'); if (!$local_stream) { die('本地文件打开失败,请检查目录写入权限'); } // 将远程流内容复制到本地流,自动完成读写操作 stream_copy_to_stream($remote_stream, $local_stream); // 关闭所有流和连接 fclose($remote_stream); fclose($local_stream); ssh2_disconnect($connection);
注意事项
- 操作前确认远程文件路径正确,且SSH用户对该文件有读取权限
- 确认本地执行脚本的用户对目标保存目录有写入权限
- 大文件下载场景可以分块读取写入,避免一次性加载全量内容导致内存溢出
内容的提问来源于stack exchange,提问作者PushApp CO
相关产品推荐
相关产品推荐

