ActiveX 経由で FTP する jQuery プラグイン を書いてみた

更新履歴

2011-06-20
Ver 0.1.1
パスにブランクが含まれてると、FTP に失敗する不具合を修正しました。

Gumblar がはやってるさなかに不謹慎な気もしますが、仕事でちょっと必要だったもので... ActiveX ということで IE でしか使えませんが IE オンリーな会社のイントラアプリや HTA アプリ向けになら使ってもいいかなと...(ダメ?)
ちなみに HTA についてはこちらが詳しいです。

使い方

プラグインの読み込み

jQueryjQuery.exActiveXFTP.js を読み込みます。

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.exactivexftp.0.1.0.js"></script>
FTP オブジェクトの生成

$.ex.activeXFTP 関数を実行し、FTP オブジェクトを生成します。この時 FTP サーバに対する 接続ユーザ、パスワード、ホスト名(IPアドレス)、サーバ上の保存先パスを指定します。

var XFTP = $.ex.activeXFTP({
	user : 'yamada_taro',
	pass : 'password',
	host : 'servername',
	savePath : '/path'
});

その他のパラメータとして以下のものがあります。

unixServer
初期値:true
FTPサーバが Windows 系の場合は false を指定します。
workPath
初期値:c:\\temp
BAT ファイル等を出力する作業フォルダを指定します。
clean
初期値:true
転送処理後、BAT ファイル等の削除をします。
fileType
初期値:binary
転送ファイルがテキストの場合は ascii を指定します。
autoExec
初期値:true
ダウンロードしたファイルを自動実行します。
アップロードファイルの選択

selectFile() メソッドを実行すると、ファイル選択のダイアログが表示されます。ユーザがファイルを選択するとファイルのフルパスが返され、キャンセルした場合はブランクが返されます。

var path = XFTP.selectFile();
if (path && confirm(path + ' をアップロードしますか?')) {
	//...
}
ファイルのアップロード

upload() メソッドでファイルをアップロードできます。引数は、アップロードするファイルのフルパス(必須)、リネームするファイル名(省略可)、アップロード後の callback 関数(省略可)となります。

XFTP.upload(path , newFilename , function(){
	//...
});
ファイルのダウンロード

download() メソッドでファイルをダウンロードできます。引数は、ダウンロードするファイル名(必須)、リネームするファイル名(省略可)、ダウンロード後の callback 関数(省略可)となります。

XFTP.download(filename , newFilename , function(){
	//...
});

使用例

以下のような画面の簡単なアプリを作ってみます。

FTP サーバへの接続情報を入力後、"UPLOAD" ボタンをクリックするとファイル選択ダイアログが表示されます。ファイルを選択すると名前が document-x.x.x.doc 形式に変換され、ファイルがアップロードされます。
アップロード後は document-x.x.x.doc の表記がリンクになり、これをクリックするとアップロードしたファイルがダウンロード&実行されます。

ソースは以下のようになります。

HTML
<body>
	<dl class="setting">
		<dt>USER</dt>
		<dd><input id="user"/></dd>
		<dt>PASSWORD</dt>
		<dd><input id="pass" type="password"/></dd>
		<dt>HOST</dt>
		<dd><input id="host"/></dd>
		<dt>UPLOAD PATH</dt>
		<dd><input id="path"/></dd>
	</dl>
	<h2>Files</h2>
	<table class="files">
		<tr>
			<td class="doc-jp">システム設計書</td>
			<td class="doc-id">document-1.0.0.doc</td>
			<td><button class="upload">UPLOAD</button></td>
		</tr>
		<tr>
			<td class="doc-jp">機能設計書</td>
			<td class="doc-id">document-2.0.0.doc</td>
			<td><button class="upload">UPLOAD</button></td>
		</tr>
		<tr>
			<td class="doc-jp">テスト仕様書</td>
			<td class="doc-id">document-3.0.0.doc</td>
			<td><button class="upload">UPLOAD</button></td>
		</tr>
		<tr>
			<td class="doc-jp">操作説明書類</td>
			<td class="doc-id">document-4.0.0.doc</td>
			<td><button class="upload">UPLOAD</button></td>
		</tr>
	</table>
</body>
JavaScript
jQuery(function($){
	var XFTP;

	//UPLOAD ボタンがクリックされた時の処理
	$('button.upload').click(function(){

		//FTP オブジェクトの生成。生成済みの場合はそれを使用
		XFTP = XFTP || $.ex.activeXFTP({
			user : $('#user').val(),
			pass : $('#pass').val(),
			host : $('#host').val(),
			savePath : $('#path').val()
		});

		//ファイル選択ダイアログを表示。
		var path = XFTP.selectFile();

		//リネームするファイル名を取得
		var tr = $(this).parents('tr');
		var file = tr.find('td.doc-id');

		//ファイルが選択された場合のみ UPLOAD 確認ダイアログを表示
		if (path && confirm(path + ' を ' + file.text() + ' としてアップロードしますか?')) {

			//アップロードを実行
			XFTP.upload(path,file.text(),function(){
				//upload後のcallback。必要に応じて Ajax による DB 更新処理なども記述。

				//ファイル名をリンク形式に変更
				var docId = tr.find('td.doc-id');
				docId.html('<a href="javascript:void(0)">'+docId.text()+'</a>');
			});
		}
	});

	//動的に生成されるダウンロード用リンクに対し live() メソッドでイベントを割り当て
	$('td.doc-id a').live('click',function(){

		//リンクに表示されたファイル名でダウンロード&実行
		XFTP.download($(this).text());
	});
});
ダウンロード

こちらからどうぞ