2017-10-23 5 views
1

Ich habe zwei Methoden Herunterladen zurück:Archiv oder ein Bild nach dem Hochladen auf FTP beschädigt ist und mit FtpWebRequest

auf den FTP-Server
  1. Uploads Dateien
  2. Downloads von Dateien von dem Server.

Alles funktioniert perfekt mit Text oder XML-Dateien. Aber wenn ich versuche, ein Archiv oder ein Bild hochzuladen und dann herunterzuladen, bekomme ich den "Windows kann den Ordner nicht öffnen. Die komprimierte ZIP-Datei ist ungültig" Fehler für die Archive und fast das gleiche für die Bilder. Was könnte das Problem sein? Hier

ist die Auflistung meiner Methoden:

Upload:

private string Upload(string Login, string Password, string FilePath, string FileName, string uuid, string FTPDir) 
{ 
    string CreateDirectory = CreateFTPDirectory(Login, Password, uuid, FTPDir); 

    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(@"ftp://" + FTPDir + uuid + "/" + FileName); 
    request.Method = WebRequestMethods.Ftp.UploadFile; 
    request.UseBinary = true; 

    StreamReader sourceStream = new StreamReader(FilePath + FileName); 
    byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); 
    sourceStream.Close(); 
    request.ContentLength = fileContents.Length; 

    using (Stream S = request.GetRequestStream()) 
    { 
     S.Write(fileContents, 0, fileContents.Length); 
    } 
    FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
    response.Close(); 

    return response.StatusDescription; 
} 

Download:

private string Download(string Login, string Password, string FileName, string uuid, string FTPDir, string Destination) 
{ 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + FTPDir + uuid + "/" + FileName); 
    request.UseBinary = true; 
    request.Method = WebRequestMethods.Ftp.DownloadFile; 
    request.Credentials = new NetworkCredential(Login, Password); 
    byte[] buffer = new byte[1024]; 

    using (var response = (FtpWebResponse)request.GetResponse()) 
    { 

     using (var stream = response.GetResponseStream()) 
     { 
      using (var fs = new FileStream(Destination, FileMode.OpenOrCreate)) 
      { 
       int readCount = stream.Read(buffer, 0, 1024); 

       while (readCount > 0) 
       { 
        fs.Write(buffer, 0, readCount); 
        readCount = stream.Read(buffer, 0, 1024);        
       } 
      } 
      return response.StatusDescription; 
     } 
    } 
} 
+3

In Ihrem 'Upload' wird der Dateiinhalt durch' Encoding.UTF8.GetBytes' geändert. Sie sollten die Daten lieber übertragen, ohne sie zu codieren/zu decodieren. –

Antwort

2

Sie eine binäre Datei hochladen (ein Bitmap-Bild), als ob es ein waren Textdatei in UTF-8-Codierung:

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

Das verdirbt natürlich die Datei.

Sie müssen Binärdateien genau so übertragen, wie sie sind, Stück für Stück.

Darüber hinaus ist Ihre Technik für potentiell große Bilddateien ziemlich ineffizient. Sie behalten die gesamte Datei mindestens zweimal im Speicher.

Der Code, die Sie benötigen, ist eigentlich viel einfacher als Sie folgende Aufgaben:

using (Stream ftpStream = request.GetResponse().GetResponseStream()) 
using (Stream fileStream = File.Create(Destination)) 
{ 
    ftpStream.CopyTo(fileStream); 
} 

:

using (Stream fileStream = File.OpenRead(FilePath + FileName) 
using (Stream ftpStream = request.GetRequestStream()) 
{ 
    fileStream.CopyTo(ftpStream); 
} 

Ihr Download-Code ist ok, aber auch hier kann es zu vereinfachen

Einen vollständigen Code finden Sie unter Upload and download a binary file to/from FTP server in C#/.NET.

+0

Vielen Dank! Ich habe auch meine Methoden nach Ihren Ratschlägen geändert. – Eric

Verwandte Themen