【C#】FtpWebRequest を使って FTPファイル送信を試してみた

開発

おはようございます。

大分久しぶりのC#ネタ。というか久しぶりのプログラムネタ。。

大したものじゃないですが、Windows Forms でFTPファイルの送信を試してみました。

スポンサーリンク

プロジェクト新規作成

今回は新規でプロジェクトを作成します。

Visual Studio を起動して、「ファイル」>「新規」からプロジェクトを作成してください。

画面の作成

ビジュアルエディタ

適当に、送信するファイルパスを指定するテキストボックス、FTP情報のテキストボックス、ファイル参照ボタン、送信ボタンを配置します。

プログラム

簡単に、フォームのコードに実装していきます。

Form1.cs

using System;
using System.Windows.Forms;
using System.IO;
using System.Net;


namespace SampleFtp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 参照ボタンクリックイベント.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_ref_Click(object sender, EventArgs e)
        {
            String initialDir = @"C:";

            if (String.IsNullOrEmpty(txb_target_file.Text) == false)
            {
                // 初期ディレクトリ
                initialDir = Path.GetDirectoryName(this.txb_target_file.Text);
            }

            OpenFileDialog ofDialog = new OpenFileDialog();
            ofDialog.InitialDirectory = initialDir;
            ofDialog.Title = "送信ファイルの指定";

            //ダイアログを表示する
            if (ofDialog.ShowDialog() == DialogResult.OK)
            {
                this.txb_target_file.Text = ofDialog.FileName;
            }
            // オブジェクトを破棄する
            ofDialog.Dispose();
        }

        /// <summary>
        /// 送信ボタンクリックイベント.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_send_Click(object sender, EventArgs e)
        {
            try
            {
                // ファイル送信
                SendFile();

                MessageBox.Show("ファイルを送信しました。");
            }
            catch (Exception ex)
            { 
                Console.WriteLine(ex.Message);
            }
        }

        private void SendFile()
        {

            String fileName = Path.GetFileName(this.txb_target_file.Text);

            // アップロード先のURI
            Uri u = new Uri("ftp://" + txb_server_ip.Text + "/" + fileName);

            // FtpWebRequestの作成
            FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create(u);

            // プロキシ未使用設定
            // IEでプロキシの設定をしているとデフォルトでプロキシ利用してしまうので
            // 明確に使わないように null を設定しておく
            ftpReq.Proxy = null;

            // ログインユーザー名とパスワードを設定
            ftpReq.Credentials = new NetworkCredential(txb_ftp_user.Text, txb_ftp_password.Text);

            // メソッドにアップロードを指定
            ftpReq.Method = WebRequestMethods.Ftp.UploadFile;

            // 要求の完了後に接続を閉じる
            ftpReq.KeepAlive = false;

            // ASCIIモードで転送する
            ftpReq.UseBinary = false;

            // PASVモードを無効にする
            ftpReq.UsePassive = false;

            // ファイルをアップロードするためのStreamを取得
            Stream reqStrm = ftpReq.GetRequestStream();

            // アップロードするファイルを開く
            FileStream fs = new FileStream(this.txb_target_file.Text, FileMode.Open, FileAccess.Read);

            // アップロードStreamに書き込む
            byte[] buffer = new byte[1024];
            while (true)
            {
                int readSize = fs.Read(buffer, 0, buffer.Length);
                if (readSize == 0)
                    break;
                reqStrm.Write(buffer, 0, readSize);
            }
            fs.Close();
            reqStrm.Close();

            // FtpWebResponseを取得
            FtpWebResponse ftpRes = (FtpWebResponse)ftpReq.GetResponse();

            // FTPサーバーから送信されたステータスを表示
            Console.WriteLine("{2}: {0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription, fileName);

            // 閉じる
            ftpRes.Close();

        }
    }
}

プロキシを設定しているとエラーとなる可能性が高いのでご注意を。

起動してみる

送信画面

ファイルを指定、FTP送信先のサーバー、ユーザー、パスワードを入力して送信ボタンをクリック。

送信結果

ということで、送信できました。

チェックやエラー処理など細かいことは何もしてませんので、必要に合わせて修正を。

まとめ

FTP接続はセキュリティ的によくないと言われているので、利用には十分ご注意ください。

そのうちセキュアなファイル送受信も調べてやってみようかな。

何かのお役に立てれば。

では。

スポンサーリンク


関連するコンテンツ

開発C#,CSharp,FTP,サンプルプログラム

Posted by doradora