FTP上传含非英文字符文件时GetRequestStream()报Error 550问题求助
解决FTP上传含非英文字符文件时的550错误
你遇到的这个问题,本质是FTP服务器无法识别含阿拉伯语这类非ASCII字符的文件名,导致调用GetRequestStream()时返回550错误(文件不可用)。大概率是编码不匹配——.NET的FtpWebRequest默认处理逻辑和你的FTP服务器编码设置没对齐,下面一步步给你解决:
1. 先排查服务器端编码支持
先用FTP客户端(比如FileZilla)手动上传一个带阿拉伯语的文件:
- 如果客户端也上传失败,说明你的FTP服务器没开启非ASCII字符支持:比如FileZilla Server可以在设置→字符集里选「强制UTF-8」;IIS FTP则要在站点设置里启用UTF-8编码。
- 如果客户端能成功上传,那问题就出在代码的编码处理上,直接看下面的代码修正方案。
2. 修正代码中的URI编码问题
FtpWebRequest不会自动对URI里的非ASCII字符做正确编码,你得手动转义目标路径/文件名,而且要注意保留路径分隔符:
错误的URI构造:
string URI = Hostname + target;
正确的做法:分段转义路径
如果target包含多级路径(比如"مستندات/ملف.txt"),要单独转义每个路径段,避免把/也转义了:
// 拆分路径为独立片段 string[] pathSegments = target.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries); // 对每个片段做URL编码 for (int i = 0; i < pathSegments.Length; i++) { pathSegments[i] = Uri.EscapeDataString(pathSegments[i]); } // 重新拼接成合法的FTP路径 string encodedTarget = string.Join("/", pathSegments); // 构造最终请求URI string URI = Hostname + encodedTarget;
3. 配置FtpWebRequest的编码相关属性
创建请求后,添加这些配置确保和服务器编码对齐:
UploadFTPRequest = GetRequest(URI); UploadFTPRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile; UploadFTPRequest.UseBinary = true; UploadFTPRequest.ContentLength = fi.Length; // 关键:开启被动模式(绝大多数FTP服务器要求) UploadFTPRequest.UsePassive = true; // 告诉服务器我们用UTF-8编码 UploadFTPRequest.Headers.Add("Accept-Charset", "UTF-8"); // 如果服务器支持SSL,按需开启 // UploadFTPRequest.EnableSsl = true;
4. 完整修正后的精简代码
System.Net.FtpWebRequest UploadFTPRequest = null; FileInfo fi = new FileInfo("你的本地文件路径"); string target = "مستندات/ملف.txt"; // 带阿拉伯语的目标路径 string Hostname = "ftp://your-server.com/"; // 编码目标路径 string[] pathSegments = target.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < pathSegments.Length; i++) { pathSegments[i] = Uri.EscapeDataString(pathSegments[i]); } string encodedTarget = string.Join("/", pathSegments); string URI = Hostname + encodedTarget; UploadFTPRequest = (FtpWebRequest)WebRequest.Create(URI); UploadFTPRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile; UploadFTPRequest.UseBinary = true; UploadFTPRequest.ContentLength = fi.Length; UploadFTPRequest.UsePassive = true; UploadFTPRequest.Headers.Add("Accept-Charset", "UTF-8"); const int BufferSize = 2048; byte[] content = new byte[BufferSize]; int dataRead; using (var UploadFileStream = fi.OpenRead()) { try { using (var UploadStream = UploadFTPRequest.GetRequestStream()) { while ((dataRead = UploadFileStream.Read(content, 0, BufferSize)) > 0) { UploadStream.Write(content, 0, dataRead); } } } catch (WebException ex) { // 捕获异常时可以查看服务器返回的详细信息 var ftpResponse = (FtpWebResponse)ex.Response; Console.WriteLine($"FTP错误详情: {ftpResponse.StatusCode} - {ftpResponse.StatusDescription}"); } }
核心思路就是让客户端编码和服务器编码保持一致,UTF-8是目前最通用的选择,只要服务器支持,基本能解决所有非英文字符的上传问题。
内容的提问来源于stack exchange,提问作者A.Bashar




