System.Net.FtpClient ist eine .NET-Library, die man für C# Applikationen verwenden kann,
um eine Verbindung zu einem FTP-Server aufzustellen und dann Dateien zu transferieren.
Ich wurde auf diese Library über diese StackOverflow
Seite aufmerksam, nachdem meine Recherchen über die FtpWebRequest
Klasse vom .NET Framework keine zufriedenstellenden Ergebnisse lieferten.
(Mit der FtpWebRequest
Klasse müssen alle Aktionen, die durchgeführt werden in die URL codiert werden. Ein Beispiel dazu habe
ich hier gefunden. Das heißt, man kann keine
Verbindung zum FTP-Server aufbauen und dann Inhalte abrufen oder raufladen, sondern man muss jede Aktion in den Request programmieren.)
Folgende Schritte sind umzusetzen:
System.Net.FtpClient.xx.xx.xx.zip
runterladen.
bin/Release
)
in das bin-Verzeichnis der ASP.NET Applikation kopieren.
using System.Net.FtpClient;
/r:bin\System.Net.FtpClient.dll
.
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\csc /target:library /r:bin\System.Net.FtpClient.dll /out:bin\FileUpload.dll src\FileUpload\*.cs
Für mein Projekt habe ich Dateien auf den FTP-Server geladen und auf eine Anfrage wieder vom FTP-Server gelesen und als
E-Mail Attachment verschickt.
Dafür habe ich mir zwei Klassen geschrieben, welche auf Funktionalitäten der System.Net.FtpClient Library zugreifen.
MemoryStream
und Datei-Informationen wie Name, Größe und Änderungsdatum kapselt.
Aufbau einer Verbindung zum Server
m_pConnection = new FtpClient(); m_pConnection.Host = pServer; m_pConnection.Credentials = new NetworkCredential(pUser, pPassword); m_pConnection.Connect();
Dabei ist m_pConnection
eine Membervariable vom Typ FtpClient
. Die Parameter pServer
,
pUser
und pPassword
sind vom Typ string
und wurden aus der Konfiguration eingelesen.
Ändern des Verzeichnisses
m_pConnection.SetWorkingDirectory(m_pWorkingDirectory);
Dabei ist m_pWorkingDirectory
eine Membervariable vom Typ string
.
Erstellen eines Verzeichnisses
bool bExists = m_pConnection.DirectoryExists(pDirectoryName); if (!bExists) m_pConnection.CreateDirectory(pDirectoryName);
Dabei ist pDirectoryName
eine Variable vom Typ string
.
Raufladen einer Datei
public void UploadFile(string pFileName, Stream pInputStream) { //1. make some checks pFileName = Utilities.PrepareString(pFileName); if (pFileName.Equals("")) return; if (pInputStream == null) return; //2. upload using (Stream pOutputStream = m_pConnection.OpenWrite(pFileName)) { try { pInputStream.CopyTo(pOutputStream); //since .NET 4.0 } finally { pOutputStream.Close(); } } }
Raufladen einer Datei (Erstellen eines MyFtpFile Objekts)
public MyFtpFile GetFtpFile(string pFileName) { pFileName = Utilities.PrepareString(pFileName); if (pFileName.Equals("")) return null; MyFtpFile pFtpFile = null; FtpListItem pObjectInfo = GetFileInformation(pFileName); using(Stream pInputStream = m_pConnection.OpenRead(pFileName)) { try { pFtpFile = new MyFtpFile(pInputStream, pObjectInfo); } catch (Exception pException) { throw new Exception("The file " + pFileName + " could not be fetched! " + pException.Message); } finally { pInputStream.Close(); } } return pFtpFile; }
Verbindung zum FTP-Server schließen
m_pConnection.Disconnect();
Übertragen der Informationen in Membervariablen
/*** member variables ***/ private MemoryStream m_pStream; private string m_pFullName, m_pName; private DateTime m_pModified, m_pCreated; private long m_lSize; /////////////////////////////// // CONSTRUCTOR // /////////////////////////////// public MyFtpFile(Stream pInputStream, FtpListItem pItem) { //1. make some checks if (pInputStream == null) throw new ArgumentNullException("No input stream!"); if (pItem == null) throw new ArgumentNullException("No ftp item information!"); //2. copy the stream m_pStream = new MemoryStream(); pInputStream.CopyTo(m_pStream); //3. copy the information m_pFullName = pItem.FullName; m_pName = pItem.Name; m_pModified = pItem.Modified; m_pCreated = pItem.Created; m_lSize = pItem.Size; }
Umwandlung der Informationen in ein E-Mail Attachment
public Attachment GetAttachment() { m_pStream.Seek(0, SeekOrigin.Begin); Attachment pAttachment = new Attachment(m_pStream, MediaTypeNames.Application.Octet); ContentDisposition pDisposition = pAttachment.ContentDisposition; pDisposition.CreationDate = m_pCreated; pDisposition.ModificationDate = m_pModified; pDisposition.ReadDate = DateTime.Now; pDisposition.FileName = m_pName; pDisposition.Size = m_lSize; pDisposition.DispositionType = DispositionTypeNames.Attachment; return pAttachment; }