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

C# FTP上传图片/Word文件后损坏,求问题排查建议

文件上传损坏的问题排查与修复

嘿,我一眼就瞅出问题所在了——你用StreamReader加UTF-8编码来读取图片、Word这类二进制文件,这完全是用错工具了!

StreamReader是专门用来处理文本文件的,它会把文件字节当成文本编码来解析成字符串,再转成UTF-8字节数组的时候,那些非文本的二进制数据会被破坏(比如图片的像素信息、Word的格式结构),上传后文件自然就损坏了。

修复后的完整代码

把读取文件的那段换成直接读二进制流的方式,和你已经设置的request.UseBinary = true配合起来,就能保证原始字节完全不变:

//FTP服务器地址
string ftp = "ftp://ftpip/";
//FTP文件夹名称,若上传至根目录则留空
string ftpFolder = "folder path to upload";
byte[] fileBytes = null;
//读取文件名
string fileName = Path.GetFileName(FileUpload1.FileName);

// 直接读取二进制流,抛弃StreamReader这种文本处理类
using (BinaryReader binaryReader = new BinaryReader(FileUpload1.PostedFile.InputStream))
{
    fileBytes = binaryReader.ReadBytes((int)FileUpload1.PostedFile.InputStream.Length);
}

try
{
    //创建FTP请求
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftp + ftpFolder + fileName);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    //输入FTP服务器凭据
    request.Credentials = new NetworkCredential("ftpuser", "ftppassowrd");
    request.ContentLength = fileBytes.Length;
    request.UsePassive = true;
    request.UseBinary = true; // 这个设置是对的,要和二进制读取配合
    request.ServicePoint.ConnectionLimit = fileBytes.Length;
    request.EnableSsl = false;
    
    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(fileBytes, 0, fileBytes.Length);
    }
    
    using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
    {
        lblMessage.Text += fileName + " uploaded.<br />";
    }
}
catch (WebException ex)
{
    var ftpResponse = ex.Response as FtpWebResponse;
    throw new Exception(ftpResponse?.StatusDescription ?? ex.Message);
}

额外的小优化说明

  • 我把原来手动调用的Close()都换成了using语句,它会自动帮你释放资源,避免忘记关闭流导致的潜在问题;
  • 异常处理里加了空判断,防止ex.Response为空时抛出空引用异常,代码更健壮;
  • 核心修复点就是用BinaryReader直接读取原始字节,完全保留文件的二进制结构,上传后就不会损坏了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:31:34