当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2015年3月24日火曜日

XPagesで文書内の添付ファイル名を取得しよう!

皆さん、こんにちは。
当ブログも今日(2015年3月24日)で丸7年となりました。明日からは8年目に突入です。
「Notes/Dominoに関する事をテキトーに書いていきます。まぁ、いつまで持つかお楽しみということで。」という副題で始めましたので、ここまで続くのは驚異的でしょう(自分で言うな?)。

ということで、お祝いとしてこのボタンをクリックしましょう。
にほんブログ村 IT技術ブログへ
お祝いなんかしてやるもんか!という方は、このままお帰りください(笑)。


さてさて、では7年目最後の記事に移りましょう。

今日は前回の記事(XPagesのファイルアップロードでファイルの種類を限定する )に関連したものです。
前回は、画像ファイルをアップロードするという話でしたが、
画像の添付ファイルが複数アップロードされている場合、それらのファイル名をどのように取得すれば良いのか、また画面にどうやって表示すれば良いのか?を検証してみます。


なお、添付ファイルを複数アップロードする方法についてはXPagesで文書保存時に添付ファイルの数を限定させるには
また、添付ファイルイメージを画面に表示させる方法についてはXPagesで添付したイメージを画面に表示させるを見てください。


まず、添付ファイルがいくつ存在するのかを確認する必要があります。
これは、NotesRichtextItemクラスのgetEmbeddedObjects()を使います。
(文書全体の場合は、NotesDocumentクラスのgetEmbeddedObjects()を使います)。
これは、java.util.Vectorで返ってきます。
ですので、size()メソッドを使って、添付ファイルの数が取得できます。
ソースコードとして書くとこんな感じでしょうか。
var curdoc = document1.getDocument( true );
var ritem  = curdoc.getFirstItem( "AttachedFile" );
if ( ritem != null ) {
    if ( ritem.getType() == 1 ) {
        if ( curdoc.hasEmbedded() ) {
            var att:java.util.Vector = ritem.getEmbeddedObjects();
            return att.size();
        }
    }
}


添付ファイルは「AttachedFile」というリッチテキストフィールドに格納してあります。

次に、ファイル名はNotesEmbeddedObjectクラスのgetSource()メソッドを利用して取得できます。
NotesEmbeddedObjectオブジェクトはgetEmbeddedObjects()の戻り値であるjava.util.Vectorの一つ一つの要素になります。
ですので、
java.util.Vectorを要素数分だけ繰り返し処理をしながら、ファイル名を取得していくという事をします。
LotusScriptの場合、Forallという関数があり、それを使いますが、JavaScriptでは使えませんので、別の方法を利用します。

java.util.Iteratorクラスを利用します。
ソースはこんな感じになります。
var curdoc = document1.getDocument();
var ritem  = curdoc.getFirstItem( "AttachedFile" );
if ( ritem.getType() == 1 ) {
    if ( curdoc.hasEmbedded() ) {
        var att:java.util.Vector = ritem.getEmbeddedObjects();
        if ( att.isEmpty() ) {
            return null;
        } else {
            var atti:java.util.Iterator = att.iterator();
            while ( atti.hasNext() ) {
                var obj:NotesEmbeddedObject = atti.next();
                print( "ファイル名=[" + obj.getSource() + "]" );
            }
        }
    }
}


java.util.IteratorはVectorオブジェクトの要素を一つずつ取り出すのに利用します。
while文でループする際、hasNext()を使って、次の要素が存在している限り繰り返すようにします。
オブジェクトの取得は、nextを使います。
取得したオブジェクトはNotesEmbeddedObjectなので、getSource()でファイル名が出力されます。



これらを応用することで、添付ファイルの分だけ画面上にイメージを表示させることができます。
「繰り返し」コントロールを配置して、「使用するバインドデータ」はJavaScriptで添付ファイルの数を出力するものを書きます(一つ目のソース)。
繰り返しコントロールの索引名に「repeatIndex」と書いておきます(名前は任意)。

「繰り返し」コントロールの中に「イメージ」コントロールを配置します。
「イメージ」コントロールの「イメージソース」は「値の計算...」でサーバーサイドのJavaScriptを記述します。
ソースは2つ目のものを書きますが、若干変更します。

変更後のソースを載せます。
var curdoc = document1.getDocument();
var ritem  = curdoc.getFirstItem( "TitleLogo" );
var attname = new java.util.Vector();
if ( ritem.getType() == 1 ) {
    if ( curdoc.hasEmbedded() ) {
        var att:java.util.Vector = ritem.getEmbeddedObjects();
        return curdoc.getUniversalID() + "/$FILE/" + att[repeatIndex].getSource();
    }
}


「繰り返し」コントロールの中に配置されているので、繰り返し処理を行う必要はなく、「repeatIndex」の箇所にあるオブジェクトを取得すれば良いです。

サンプルDBとして作り、動かしてみたのがこちらの画面です。
複数のイメージを画面上に表示する

実用性はともかく・・・
XPagesではこのようなことも行えます。
ぜひ、活用してみてください。

では、今日はこの辺で。




Web化するならXPages!








【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: