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

使用C# SSH.NET读取SFTP服务器中带特殊文件名的图片流及替代方案问询

解决SSH.NET读取SFTP带特殊字符文件名的流问题

首先得指出你第一个代码里的核心错误:你用FileStream去打开SFTP服务器上的远程路径remotePath + dto.FileName,但FileStream是用来操作本地文件系统的,本地系统里*是通配符,不能作为文件名的一部分,所以才会抛出「无效字符」异常——这和SFTP服务器上的文件名无关,是你用错了文件操作的对象。

正确的SSH.NET读取远程文件流的方式

SSH.NET的SftpClient提供了专门的方法来读取远程文件,完全对应你之前用FtpWebRequest.GetResponseStream()的需求,就是OpenRead()方法,它直接返回远程文件的可读流,而且支持服务器上带*这类特殊字符的文件名(只要文件确实存在)。

下面是修正后的完整示例代码:

// 先确保你的connectToServer方法正确返回已连接的SftpClient
using (SftpClient client = connectToServer(IP, user, pwd))
{
    client.Connect(); // 如果connectToServer没自动做连接,记得手动调用
    string remoteFilePath = Path.Combine(client.WorkingDirectory, dto.Directory, dto.FileName);
    
    // 打开远程文件的可读流,对应FtpWebRequest的GetResponseStream()
    using (Stream remoteFileStream = client.OpenRead(remoteFilePath))
    {
        HttpResponse response = HttpContext.Current.Response;
        // 设置响应头,告诉浏览器返回的是图片
        response.ContentType = "image/png";
        response.ContentLength = remoteFileStream.Length;
        
        // 将远程文件流复制到响应输出流(这才是正确用法,之前你尝试读取输出流是搞反了方向)
        remoteFileStream.CopyTo(response.OutputStream);
        response.Flush();
    }
}

关于HttpResponse.OutputStream的错误说明

你之前尝试从response.OutputStream读取是完全错误的,因为这个流是只写的,用于向客户端输出内容,不能从中读取数据。正确的做法是把SFTP获取到的可读流复制到这个输出流里,就像上面代码里的CopyTo操作。

关键要点

  • 永远不要用FileStream处理SFTP远程路径,必须通过SftpClient的方法来操作远程文件
  • SftpClient.OpenRead()是获取远程文件可读流的标准方式,和FtpWebRequest.GetResponseStream()功能完全匹配
  • 处理流时记得用using语句,确保资源被正确释放,避免连接泄漏

内容的提问来源于stack exchange,提问作者WorksOnMyLocal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 02:57:37