📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| 279行目: | 279行目: | ||
// 複数のファイルを同時に受信 | // 複数のファイルを同時に受信 | ||
await ftpDownload.DownloadMultipleFilesAsync(filesToDownload); | await ftpDownload.DownloadMultipleFilesAsync(filesToDownload); | ||
} | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== FTPS : データの送信 == | |||
以下の例では、FTPS (SSL / TLS証明書) を使用して、ASCIIモード (テキストファイル) とバイナリモード (画像ファイル等) で複数のファイルを非同期に送信している。<br> | |||
<br> | |||
※注意<br> | |||
実務では、適切なSSL / TLS証明書の検証を行うこと。<br> | |||
ファイアウォールやネットワーク設定が、FTPSトラフィック (通常は、990番ポート) を許可していることを確認する。<br> | |||
<br> | |||
また、大量のファイルや大きなファイルを送信する場合は、タイムアウト設定やメモリ使用量に注意する。<br> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
using System; | |||
using System.IO; | |||
using System.Collections.Generic; | |||
using System.Threading.Tasks; | |||
using System.Net; | |||
using System.Net.Security; | |||
using System.Security.Cryptography.X509Certificates; | |||
class AsyncFtpsFileUpload | |||
{ | |||
private string host; | |||
private string username; | |||
private string password; | |||
private int port; | |||
// FTPS接続に必要な情報 | |||
public AsyncFtpsFileUpload(string host, string username, string password, int port = 990) | |||
{ | |||
this.host = host; | |||
this.username = username; | |||
this.password = password; | |||
this.port = port; | |||
} | |||
// 単一のファイルを非同期でアップロード | |||
public async Task UploadFileAsync(string localFilePath, string remoteFilePath, bool useAscii) | |||
{ | |||
try | |||
{ | |||
// FTPS要求の作成 | |||
FtpWebRequest request = (FtpWebRequest)WebRequest.Create($"ftps://{host}:{port}/{remoteFilePath}"); | |||
request.Method = WebRequestMethods.Ftp.UploadFile; // ファイルの送信 | |||
request.Credentials = new NetworkCredential(username, password); | |||
request.UsePassive = true; // パッシブモードを使用するかどうかの可否 | |||
request.UseBinary = !useAscii; // ASCIIモードとバイナリモードの切り替え | |||
request.KeepAlive = false; | |||
request.EnableSsl = true; // SSLを有効化 | |||
// SSL / TLS証明書の検証 | |||
// 注意: 実務では適切に証明書を検証すること | |||
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; }); | |||
using (FileStream fileStream = File.OpenRead(localFilePath)) | |||
using (Stream ftpStream = await request.GetRequestStreamAsync()) | |||
{ | |||
// ファイルは10[KB]のバッファを使用して読み取り、FTPストリームに書き込む | |||
byte[] buffer = new byte[10240]; | |||
int read; | |||
while ((read = await fileStream.ReadAsync(buffer, 0, buffer.Length)) > 0) | |||
{ | |||
await ftpStream.WriteAsync(buffer, 0, read); | |||
} | |||
} | |||
using (FtpWebResponse response = (FtpWebResponse)await request.GetResponseAsync()) | |||
{ | |||
Console.WriteLine($"ファイルの送信が完了: {localFilePath} -> {remoteFilePath}"); | |||
Console.WriteLine($"ステータス: {response.StatusDescription}"); | |||
} | |||
} | |||
catch (WebException ex) | |||
{ | |||
FtpWebResponse response = (FtpWebResponse)ex.Response; | |||
if (response != null) | |||
{ | |||
Console.WriteLine($"FTPS送信エラー: {response.StatusDescription}"); | |||
} | |||
else | |||
{ | |||
Console.WriteLine($"Web例外が発生: {ex.Message}"); | |||
} | |||
} | |||
catch (Exception ex) | |||
{ | |||
Console.WriteLine($"予期せぬエラーが発生: {ex.Message}"); | |||
} | |||
} | |||
// 複数のファイルを同時に非同期でアップロードするメソッド | |||
public async Task UploadMultipleFilesAsync(List<(string localFilePath, string remoteFilePath, bool useAscii)> files) | |||
{ | |||
List<Task> uploadTasks = new List<Task>(); | |||
// 各ファイルのアップロードタスクを生成して、リストに追加 | |||
foreach (var file in files) | |||
{ | |||
uploadTasks.Add(UploadFileAsync(file.localFilePath, file.remoteFilePath, file.useAscii)); | |||
} | |||
// 全てのアップロードタスクが完了するまで待機 | |||
await Task.WhenAll(uploadTasks); | |||
Console.WriteLine("全てのファイルの送信が完了"); | |||
} | |||
public static async Task Main() | |||
{ | |||
// FTPS接続情報 | |||
string host = "<ホスト名またはIPアドレス 例: ftps.example.com>"; | |||
string username = "<ユーザ名>"; | |||
string password = "<パスワード>"; | |||
int port = 990; // FTPSの標準ポート | |||
AsyncFtpsFileUpload ftpsUpload = new AsyncFtpsFileUpload(host, username, password, port); | |||
// 送信するファイル群 | |||
List<(string localFilePath, string remoteFilePath, bool useAscii)> filesToUpload = new List<(string, string, bool)> | |||
{ | |||
("localTextFile1.txt", "remoteTextFile1.txt", true), // テキストファイル(ASCIIモード) | |||
("localTextFile2.txt", "remoteTextFile2.txt", true), // テキストファイル(ASCIIモード) | |||
("localImageFile1.jpg", "remoteImageFile1.jpg", false), // 画像ファイル(バイナリモード) | |||
("localImageFile2.jpg", "remoteImageFile2.jpg", false) // 画像ファイル(バイナリモード) | |||
}; | |||
// 複数のファイルを同時に送信 | |||
await ftpsUpload.UploadMultipleFilesAsync(filesToUpload); | |||
} | } | ||
} | } | ||