何が起こったか
最近、私のプロジェクトで、クライアントの要件としてファイルをローカルマシンやデータベースではなくFTPサーバーに保存する必要性が発生しました。そのため、C#でFTPを簡単に操作する方法を調査し始めました。
以前、私のFTPに関する理解は手動でFileZillaを使用することに限られており、プログラムでの操作についてはまだ探求していませんでした。
FluentFTPの紹介
GitHubの作者によると、FluentFTPは.NETをベースにしたFTPとFTPS向けのツールで、ファイルのアップロード/ダウンロード、SSL/TLS接続、自動ディレクトリリストの解析、ファイルのハッシュ/検証、ファイルのパーミッション/CHMOD、FTPプロキシ、FXP転送、UTF-8サポート、Async/awaitサポート、PowerShellサポートなど、いくつかの一般的な操作をサポートしています。
一般的な機能
ここでは、プロジェクトで使用したいくつかの機能を紹介します(後で追加の紹介が提供される場合があります)。
機能のいずれかを使用する前に、接続を確立してください(C#のusingディレクティブにFluentFTPを含めることを忘れないでください)。
接続の確立
private static FtpClient createFtpClient() {
FtpClient ftp = new FtpClient(ftpAddress, ftpPort);
ftp.Credentials = new System.Net.NetworkCredential(ftpAcc, ftpPwd);
ftp.Connect();
return ftp;
}
ここに共有接続を確立する簡単な方法があります。プロジェクトでFTPに関するさまざまな操作があるため、接続方法は抽出して独立して書かれています。
接続の詳細には以下が含まれます:
- ftpAddress:FTPサーバーのIPアドレス(エイリアスも機能するようです)。
- ftpPort:FTPサーバーのポート番号。
- ftpAcc、ftpPwd:FTP接続のユーザーアカウントとパスワード。
また、Connectメソッドがあるので、Disconnectもあります。通常、使用後に接続を終了するために呼び出されます。
フォルダの作成
public static bool initDict() {
bool result = false;
try
{
FtpClient ftp = createFtpClient();
result = ftp.CreateDirectory("pdf");
ftp.Disconnect();
}
catch (Exception ex) {
throw ex;
}
return result;
}
ftp.CreateDirectory:指定したディレクトリが存在しない場合、作成されます。
これは複数のレベルを作成するのにも役立ちます。たとえば、ftp.CreateDirectory("pdf\\test")は、ルートに「pdf」というフォルダを作成し、その下に「test」というサブフォルダを作成します。
ファイルのアップロード(単一ファイル)
public static bool uploadPdf(HttpPostedFileBase file) {
bool result = false;
FtpClient ftp = createFtpClient();
byte[] fileBytes;
using (BinaryReader reader = new BinaryReader(file.InputStream))
{
fileBytes = reader.ReadBytes(file.ContentLength);
}
FtpStatus ftpStatus = ftp.UploadBytes(fileBytes, "pdf\\" + file.FileName);
ftp.Disconnect();
return result;
}
このセクションでは、UploadBytesメソッドを使用してバイト配列をアップロードします。提供された例では、PDFファイルをFTPサーバーの「pdf」フォルダに送信します。
さらに、FtpStatusには3つの可能な値があります:失敗の場合は0、成功の場合は1、スキップされた場合は2です。 「スキップされた」ステータスは、ファイルがすでにFTPサーバーに存在する場合に発生します。
FTPディレクトリにディレクトリ全体をアップロード
public static void uploadDir(string uploadDir, string desDir) {
FtpClient ftp = createFtpClient();
ftp.CreateDirectory(desDir);
List<FtpResult> res = ftp.UploadDirectory(uploadDir, desDir);
ftp.Disconnect();
}
ftp.UploadDirectory:ローカルディレクトリ全体をFTPサーバーの指定したディレクトリにアップロードします。
このメソッドは、アップロードプロセスの各ファイルの状態を含むFtpResultオブジェクトのリストを返します。
単一ファイルのダウンロード
public static byte[] downloadPdf(string pdfName) {
byte[] arr;
FtpClient ftp = createFtpClient();
bool res = ftp.DownloadBytes(out arr, "pdf\\" + pdfName);
ftp.Disconnect();
return arr;
}
outパラメータを使用してファイルをダウンロードし、byte[]を提供し、ファイルの場所を指定します。
この例では、以前にアップロードしたPDFをダウンロードします。
現在のディレクトリをリストします
/// <summary>
/// 現在のディレクトリの内容をリストします(再帰的ではなく)。
/// </summary>
public void ListAll()
{
FtpClient ftp = CreateFtpClient();
foreach (var item in ftp.GetListing())
{
Debug.WriteLine(item.ToString());
}
ftp.Disconnect();
}