C# – 上传到服务器后文件已损坏

我使用以下源代码上传文件excel和pdf,但在文件移动到服务器后,文件已损坏。 我认为问题在于编码过程Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); ,但我不知道如何解决它。

 public static void sampleUpload() { // Get the object used to communicate with the server. FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://100.165.80.15:21/output/Group Dealer, Main Dealer, Zone, Branch, and Destination Report_20120927105003.pdf"); request.Method = WebRequestMethods.Ftp.UploadFile; // This example assumes the FTP site uses anonymous logon. request.Credentials = new NetworkCredential("toc", "fid123!!"); // Copy the contents of the file to the request stream. StreamReader sourceStream = new StreamReader("D:\\Group Dealer, Main Dealer, Zone, Branch, and Destination Report_20120927105003.pdf"); byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); sourceStream.Close(); request.ContentLength = fileContents.Length; Stream requestStream = request.GetRequestStream(); requestStream.Write(fileContents, 0, fileContents.Length); requestStream.Close(); FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription); response.Close(); } 

不要将二进制文件作为文本读取。 使用Stream.CopyTo方法(如果不能使用.Net 4.0,则使用等效代码)

  using(StreamReader sourceStream = ...){ using(Stream requestStream = request.GetRequestStream()) { sourceStream.CopyTo(requestStream); } } 

您可以尝试使用处理原始字节的BufferedStream。

在我的情况下,我不能像Alexei在他的回答中所建议的那样使用Stream.Copy因为我使用.NET Framework 2.0而只使用Stream来读取二进制文件,因为Streamreader仅用于读取文本文件:

 public static void sampleUpload() { // Get the object used to communicate with the server. FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://100.165.80.15:21/output/Group Dealer, Main Dealer, Zone, Branch, and Destination Report_20120927105003.pdf"); request.Method = WebRequestMethods.Ftp.UploadFile; request.UseBinary = true; // This example assumes the FTP site uses anonymous logon. request.Credentials = new NetworkCredential("toc", "fid123!!"); // Copy the contents of the file to the request stream. byte[] b = File.ReadAllBytes(sourceFile); request.ContentLength = b.Length; using (Stream s = request.GetRequestStream()) { s.Write(b, 0, b.Length); } FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription); response.Close(); }