2016-05-14 17 views
0

Ich verwende den Code unten eine Zip-Datei, um zu meinem FTP-Server zu:C#: ftp-Upload ist erfolgreich, aber dowloaded Datei beschädigt ist

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!"); 
} 

Mein Zip-Archiv ist auf jeden Fall gültig ist (ich kann es öffnen und extrahieren Sie es), aber wenn ich die hochgeladene Zip-Datei herunterladen, habe ich den Fehler, dass das Archiv beschädigt ist.

Update 1: mein Quellcode von MSDN-Artikel ist: How to: Upload Files with FTP

+0

Warum würden Sie 'Unicode.GetBytes()' auf Binärinhalt benötigen? Hast du 'byte [] fileContents = File.ReadAllBytes (zipPath)' stattdessen versucht? –

+0

Es basiert nur auf dem MSDN Artikel, den ich erwähnte. – wiki

+1

Ja, aber sie haben eine Textdatei hochgeladen, wo die UTF8-Kodierung eigentlich Sinn macht (hätte aber trotzdem funktionieren sollen, wenn sie Byte für Byte übertragen wurde). Für Binärdateien wie eine '.zip' Datei scheint es keinen Sinn zu ergeben. –

Antwort

1

verwenden Sie Anfrage an FtpWebRequest (wie in diesem MSDN Beispiel) werfen sollte und dann Anfrage als binäre angeben (Sie hochladen Binärdatei, nicht Text).

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

Danke für die Klarstellung – wiki

0

Ich kann nicht sagen, was das Problem ist, aber ich kann eine alternative Lösung. Sie können WebClient statt 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

Ich kenne den Grund für die Abstimmung nicht, aber Ihre Lösung funktioniert gut; Vielen Dank. – wiki

Verwandte Themen