InDesign CS3でFTP, HTTP通信を行う (7)

今回でInDesign CS3を使ったFTP, HTTP通信のネタは終わりです。

 FTPサーバー上にあるデータが更新された、追加された場合に処理を行いたい場合にはファイル一覧を取得しなければなりません。一般的にはファイル一覧を取得すると配列変数にファイル情報が格納されますがCS3の場合、FTPオブジェクトのいくつかのプロパティに分割されて格納されます。
 まず、ファイル一覧はls()により取得することができます。ls()の戻り値はtrueまたはfalseで、取得に成功した場合にはtrue、失敗した場合にはfalseとなります。これとは別にFTPの場合、パッシブモードを設定しておく必要があります。これはネットワーク環境に依存します。パッシブモードはFTPオブジェクトのpassiveプロパティにtrueまたはfalseを指定します。trueであればパッシブモードになります。ls()でファイル一覧を取得したまま次の処理が行われない場合にはパッシブモードの設定を確認してみてください。
 ls()によりファイル一覧を取得できた場合には、それぞれ以下のFTPオブジェクトのプロパティにファイル情報が格納されます。

files ファイル名/ディレクトリ名
flags 種類(ファイルかディレクトリかなど)
sizes ファイルサイズ (バイト数)
dates ファイルの作成日 (Dateオブジェクト)

 サンプルはFTPサーバー上にあるホームディレクトリの一覧を取得しInDesign上に配置するものです。
 ls()によるファイル一覧の取得を行う場合には必ず以下の方法でWeb Accessライブラリを読み込ませてください。古いJavaScript Tools Guideのサンプルコードではエラーになってしまうことがあるためです。

if ( !ExternalObject.webaccesslib ) {
ExternalObject.webaccesslib = new ExternalObject("lib:webaccesslib");
}

また、FTP処理でエラーが発生した場合にはFTPオブジェクトのerrorプロパティを参照することで、どのようなエラーなのかを確認することができます。エラーの中でもタイムアウトに関しては注意が必要です。タイムアウトまでの時間はFTPオブジェクトのtimeoutプロパティで秒数を指定します。特に設定しない場合には5秒となっており、ネットワーク環境や状況によってはタイムアウトとなってしまうこともあります。うまく接続できない場合にはタイムアウトまでの時間を120秒や180秒など長めに指定してみてください。

// FTPサーバーにあるファイル一覧を取得しInDesign上に配置する
(function(){
var CR = String.fromCharCode(13);
var tfObj = app.activeDocument.textFrames.add();
tfObj.visibleBounds = ["2cm", "3cm", "10cm", "14cm"];
var fileList = getFtpFilelist("ftp://www.openspc2.org","adobe","indesign","./",);
for (var i=0; i<fileList.files.length; i++){
tfObj.contents += fileList.files[i] + CR;
}
})();

// FTPを使って指定されたサーバーのディレクトリにあるファイル一覧を取得し返す
function getFtpFilelist(sURL, userName, password, dir){
if ( !ExternalObject.webaccesslib ) {
ExternalObject.webaccesslib = new ExternalObject("lib:webaccesslib");
}
var ftp = new FtpConnection(sURL);
ftp.username = userName;
ftp.password = password;
ftp.ftpDir = dir;
ftp.passive = false; // パッシブモードの設定
var flag = ftp.ls();
if (flag == false){
alert("エラーです。ファイル一覧を取得できません");
}
ftp.close();
return ftp;
}

 これで、やっとInDesign CS3の通信ネタが終わりですが、このような機能を利用することでより自動化を進めることが可能になります。Webサーバーなどを用意したりせずともInDesign CS3で可能になるわけです。使い方次第で強力なものになると思います。

[サンプルをダウンロード]