2016-05-14 82 views
0

我正在使用的代码波纹管上传一个zip文件到我的FTP服务器:C#:ftp上传成功,但dowloaded文件被损坏

string zipPath = @"d:\files\start.zip"; 
string ftpPath = ("ftp://######/start.zip"); 


WebRequest request = WebRequest.Create(ftpPath); 
request.Method = WebRequestMethods.Ftp.UploadFile; 
request.Credentials = new NetworkCredential("######", "######"); 

StreamReader sourceStream = new StreamReader(zipPath); 
byte[] fileContents = Encoding.Unicode.GetBytes(sourceStream.ReadToEnd()); 
sourceStream.Close(); 
request.ContentLength = fileContents.Length; 

try 
{ 
    Stream requestStream = request.GetRequestStream(); 
    requestStream.Write(fileContents, 0, fileContents.Length); 
    requestStream.Close(); 

    FtpWebResponse makeFileUploadResponse = (FtpWebResponse)request.GetResponse(); 
} 
catch 
{ 
    MessageBox.Show("ftp failed!"); 
} 

我的zip压缩包,绝对是有效的(我可以打开它并提取它),但是当我下载上传的zip文件时,我收到了归档被损坏的错误。

更新1:我的源代码是从MSDN的文章:How to: Upload Files with FTP

+0

为什么你需要二进制内容的'Unicode.GetBytes()'?你尝试过'byte [] fileContents = File.ReadAllBytes(zipPath)'而不是? –

+0

这只是基于我提到的MSDN文章。 – wiki

+1

是的,但他们上传了一个文本文件,其中UTF8编码实际上是有意义的(但是如果它们逐字节地传输,它们仍应该工作)。对于像'.zip'文件这样的二进制文件,对我来说这似乎没有意义。 –

回答

1

你应该投请求FtpWebRequest(如在MSDN的例子) 然后指定要求为二进制(你上传的二进制文件,而不是文本)。

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("aa"); 
request.Method = WebRequestMethods.Ftp.UploadFile; 
request.UseBinary = true; 
+0

感谢您的澄清 – wiki

0

我不能说是什么问题,但我可以提供一个替代的解决方案。您可以使用WebClient代替WebRequest

string zipPath = @"d:\files\start.zip"; 
string ftpPath = ("ftp://######/start.zip"); 
WebClient ftpClient = new WebClient(); 
ftpClient.Credentials = new NetworkCredential("####", "######"); 
try{ 
    ftpClient.UploadFile(ftpPath, WebRequestMethods.Ftp.AppendFile, zipPath); 
} 
catch(WebException ex){ 
    MessageBox.Show("ftp failed"); 
} 
+0

我不知道投票的原因,但你的解决方案工作得很好;谢谢。 – wiki