使用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
相关产品推荐
相关产品推荐

