You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动