C#上传文件至FTP服务器调用GetRequestStream()报路径错误问题求助
问题排查及修复方案
核心错误原因
- FTP目标路径格式错误:你构造的FTP地址用了多组连续的双正斜杠
//,FTP标准路径只需要用单正斜杠分隔目录,连续斜杠会被服务器识别为非法路径 - FTP目标文件名不匹配:本地要上传的文件名是
ErrFileName+日期+.csv,但你拼接的FTP目标路径只加了ErrFileName.Trim(),没有拼接日期和.csv后缀,上传目标必须指定到完整文件名才合法 - 未验证本地文件存在性:读取本地文件前没有判断文件是否存在,若本地文件生成失败也会触发路径类错误
- 未确认FTP父目录存在:
FtpWebRequest不会自动创建目标路径的上级目录,如果FTP服务器上对应的/xxxxxxxxxx/xxxxxxxx/目录不存在,直接上传会报路径错误
优化后可运行代码
// 构造本地文件名,用Path.Combine避免斜杠拼接错误 string CurFileName = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"{ErrFileName.Trim()}{DateTime.Today.ToString("ddMMyyyy")}.csv"); // 先校验本地文件是否存在 if (!File.Exists(CurFileName)) { Console.WriteLine($"本地文件不存在:{CurFileName}"); return; } // FTP路径用单斜杠分隔,目标文件名和本地保持一致 string ftpDir = "ftp://x.xxx.xxx.xxx/xxxxxxxxxx/xxxxxxxx/"; string Destination = $"{ftpDir}{Path.GetFileName(CurFileName)}"; try { FtpWebRequest request = (FtpWebRequest)WebRequest.Create(Destination); request.Method = WebRequestMethods.Ftp.UploadFile; request.Credentials = new NetworkCredential("你的FTP账号", "你的FTP密码"); request.Proxy = null; request.KeepAlive = true; request.UseBinary = true; // 直接读取文件字节,避免编码转换引发的文件损坏问题 byte[] fileContents = File.ReadAllBytes(CurFileName); request.ContentLength = fileContents.Length; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(fileContents, 0, fileContents.Length); } using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { Console.WriteLine($"上传成功,状态:{response.StatusDescription}"); File.Delete(CurFileName); } } catch (WebException e) { if (e.Response is FtpWebResponse ftpResponse) { Console.WriteLine($"FTP错误:{ftpResponse.StatusDescription}"); } Console.WriteLine($"异常详情:{e.Message}"); }
额外验证建议
- 先把构造出来的
Destination字符串打印出来,复制到浏览器地址栏访问,看能不能正常弹出FTP认证框,确认路径本身合法 - 确认FTP账号对目标目录有写入权限
内容的提问来源于stack exchange,提问作者SSN
相关产品推荐
相关产品推荐

