2013-05-11 170 views
7

我正在尝试上传一个邮编使用C# (Framework 4)的文件到服务器,以下是我的代码。使用C#上传到服务器后,Zip文件被损坏

string ftpUrl = ConfigurationManager.AppSettings["ftpAddress"]; 
string ftpUsername = ConfigurationManager.AppSettings["ftpUsername"]; 
string ftpPassword = ConfigurationManager.AppSettings["ftpPassword"]; 
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl + "Transactions.zip"); 
request.Proxy = new WebProxy(); //-----The requested FTP command is not supported when using HTTP proxy. 
request.Method = WebRequestMethods.Ftp.UploadFile; 
request.Credentials = new NetworkCredential(ftpUsername, ftpPassword); 
StreamReader sourceStream = new StreamReader(fileToBeUploaded); 
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(); 

的zip文件上传成功,但是当我试图打开从服务器(手动)的zip文件,这表明我Unexpected end of archive错误。
对于文件压缩,我使用的是Ionic.zip dll。在传输zip文件之前,我能够成功提取。

任何帮助表示赞赏。谢谢。

+0

尝试避免sourceStream.ReadToEnd()并直接从sourceStream复制字节到requestStream – 2013-05-11 09:44:17

回答

14

这就是问题:

StreamReader sourceStream = new StreamReader(fileToBeUploaded); 
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); 

StreamReader(和任何TextReader)可以文本数据。一个zip文件不是文本数据。

只需使用:

byte[] fileContents = File.ReadAllBytes(fileToBeUploaded); 

这样,你不处理二进制数据,文本,所以它不应该遭到损坏。

或者,不要将其全部加载到内存中单独 - 只是流中的数据:

using (var requestStream = request.GetRequestStream()) 
{ 
    using (var input = File.OpenRead(fileToBeUploaded)) 
    { 
     input.CopyTo(requestStream); 
    } 
} 

另外请注意,您应该使用using语句对所有这些流,而不是只调用Close - 即使抛出异常,资源也会被丢弃。

+0

我的上帝,我从Jon Skeet先生得到了一个答案!对我来说这是一个幸运的日子。谢谢。 – Praveen 2013-05-11 09:46:27

+0

有没有办法知道我们的文件是否成功上传,比如'status.code = OK'? – Praveen 2013-05-22 09:04:05

+1

@ user1671639:是的 - 从'FtpWebResponse'获取状态码,看它是'CommandOK'还是'FileActionOK'。 (可能还有其他一些人需要寻找 - 试验它。)说实话,如果失败的时候得到答复,我希望它会抛出异常。 – 2013-05-22 10:49:03

相关问题