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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:45:10