FTP でファイルを転送する際、サーバーによっては日本語のようなマルチバイト文字を含むファイル名が文字化けしてしまうことがあります。
この問題を確実に避けるため、ファイル名に安全な半角英数字しか使われていないかを事前にチェックする機能を備えた、GUI 付きのファイルアップロードツールを作成します。
目次
完成したスクリプトの全コード
#include <FTPEx.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
; ### GUIの定義 ###
Local $hGUI = GUICreate("FTP ファイルアップローダー", 420, 320)
; --- サーバー情報グループ ---
GUICtrlCreateGroup("サーバー情報", 10, 10, 400, 160)
GUICtrlCreateLabel("サーバー:", 20, 35, 100, 20)
Local $idInput_Server = GUICtrlCreateInput("ftp.example.com", 130, 30, 270, 25)
GUICtrlCreateLabel("ユーザー名:", 20, 65, 100, 20)
Local $idInput_User = GUICtrlCreateInput("your_username", 130, 60, 270, 25)
GUICtrlCreateLabel("パスワード:", 20, 95, 100, 20)
Local $idInput_Pass = GUICtrlCreateInput("your_password", 130, 90, 270, 25, $ES_PASSWORD)
GUICtrlCreateLabel("アップロード先:", 20, 125, 100, 20)
Local $idInput_RemoteDir = GUICtrlCreateInput("/public_html/", 130, 120, 270, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1) ; グループを閉じる
; --- ファイル選択グループ ---
GUICtrlCreateGroup("アップロードするファイル", 10, 180, 400, 80)
GUICtrlCreateLabel("ローカルファイル:", 20, 205, 100, 20)
Local $idInput_LocalFile = GUICtrlCreateInput("", 130, 200, 180, 25)
Local $idBtn_Browse = GUICtrlCreateButton("参照...", 320, 200, 80, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1) ; グループを閉じる
; --- アップロードボタン ---
Local $idBtn_Upload = GUICtrlCreateButton("アップロード開始", 10, 270, 400, 40)
GUISetState(@SW_SHOW)
; ### メインループ ###
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idBtn_Browse
Local $sFile = FileOpenDialog("ファイルを選択", @MyDocumentsDir, "すべてのファイル (*.*)")
If Not @error Then GUICtrlSetData($idInput_LocalFile, $sFile)
Case $idBtn_Upload
_UploadFile()
EndSwitch
WEnd
Exit
; ### ファイルをアップロードするメイン関数 ###
Func _UploadFile()
; GUIの各入力欄から値を取得
Local $sServer = GUICtrlRead($idInput_Server)
Local $sUsername = GUICtrlRead($idInput_User)
Local $sPassword = GUICtrlRead($idInput_Pass)
Local $sRemoteDir = GUICtrlRead($idInput_RemoteDir)
Local $sLocalFile = GUICtrlRead($idInput_LocalFile)
If $sLocalFile = "" Or Not FileExists($sLocalFile) Then
MsgBox($MB_ICONEXCLAMATION, "注意", "有効なファイルを選択してください。")
Return
EndIf
; --- ファイル名チェック ---
Local $aPathSplit = StringSplit($sLocalFile, "\")
Local $sFileName = $aPathSplit[$aPathSplit[0]]
; 正規表現を使い、ファイル名が半角英数字と一部の記号(_.-)のみで構成されているかチェック
If Not StringRegExp($sFileName, '^[a-zA-Z0-9_.-]+$') Then
MsgBox($MB_ICONERROR, "ファイル名エラー", "ファイル名には半角英数字と一部の記号(_.-)しか使用できません。" & @CRLF & "ファイル名を変更してください。")
Return
EndIf
; --- チェック完了 ---
Local $sRemoteFile = $sRemoteDir & $sFileName
Local $hOpen = _FTP_Open("MyFTP Control")
Local $hConn = _FTP_Connect($hOpen, $sServer, $sUsername, $sPassword)
If @error Then
MsgBox($MB_ICONERROR, "接続失敗", "FTPサーバーへの接続に失敗しました。")
_FTP_Close($hOpen)
Return
EndIf
; サーバーがUTF-8モードに対応している場合に備え、念のためコマンドを送信
_FTP_Command($hConn, "OPTS UTF8 ON")
_FTP_FilePut($hConn, $sLocalFile, $sRemoteFile)
If @error Then
MsgBox($MB_ICONERROR, "アップロード失敗", "ファイルのアップロードに失敗しました。" & @CRLF & "エラーコード: " & @error)
Else
MsgBox($MB_OK, "成功", "ファイルのアップロードが完了しました。")
EndIf
_FTP_Close($hOpen)
EndFunc ;==>_UploadFile
コードの詳しい解説
ユーザーインターフェースの作成
このツールの最大の特徴は、全ての操作を GUI で完結できる点です。
- サーバー情報の入力: サーバーアドレス、ユーザー名、パスワード、アップロード先のフォルダーを直接入力できます。これにより、スクリプトのコードを書き換えることなく、様々な FTP サーバーに接続できます。パスワード入力欄は、入力した文字が「●」で表示されるように設定されています。
- ファイルの選択: 「参照…」ボタンから、アップロードしたいファイルを直感的に選択できます。
ファイル名の安全チェック
_UploadFile関数の中には、文字化けを防ぐための重要なチェック機能が組み込まれています。
StringRegExp($sFileName, '^[a-zA-Z0-9_.-]+$'):この一行が、ファイル名の安全性をチェックする心臓部です。正規表現というパターンマッチング技術を使い、「ファイル名が、先頭(^)から末尾($)まで、半角のアルファベット(a-z, A-Z)、数字(0-9)、そして一部の安全な記号(_, ., -)のみで構成されているか」を判定します。- エラー通知: もしファイル名に日本語やスペース、その他の特殊記号が含まれている場合、このチェックに失敗し、「ファイル名エラー」というメッセージを表示して、アップロード処理を安全に中断します。
FTP アップロード処理
ファイル名のチェックを無事に通過すると、FTPEx.au3 ライブラリの関数群を使って、実際のアップロード処理が行われます。
_FTP_Open でセッションを開始し、_FTP_Connect でサーバーに接続、_FTP_FilePut でファイルを転送し、最後に_FTP_Close で接続を安全に終了する、という一連の流れを自動で実行します。
まとめ
このスクリプトは、GUI による優れた操作性と、正規表現によるファイル名の安全チェック機能を組み合わせることで、誰でも安心して使える実用的な FTP アップロードツールを実現しています。
FTP の文字化けという典型的な問題を、ユーザーに分かりやすい形で未然に防ぐ、洗練されたアプローチの一例です。
コメント