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

