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

テクてく 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 カスタマイズとセキュリティ強化 - 株式会社エフ

2015年3月4日水曜日

XPagesのファイルアップロードでファイルの種類を限定する

皆さん、こんにちは。
先日、誕生日を迎えて、四捨五入すると50歳という、もう「アラフィフ」と言っても良くなってしまいました。
全然めでたくありません!

めでたくないので、このボタンをクリックしてください。
にほんブログ村 IT技術ブログへ


今日は久しぶりにXPagesの話題です。
たまには書かないと、「こいつ、ホントにXPagesできるのか?」と疑われてしまいそうなので(笑)


XPagesでは、ファイルを添付するのに便利な「ファイルアップロード」コントロールがあります。
こちらの説明については、以前にも書いていますので、
XPagesで添付ファイルの処理をする(アップロード)
XPagesで文書保存時に添付ファイルの数を限定させるには
そちらを参照願います。

さて、今日はそんなファイルアップロードコントロールのちょっとした応用についてです。
ファイルを添付する際、ファイルの種類を限定したい場合があります。
私にはそんな理由がありました。

それを実現する方法について説明します。

通常のHTMLでは、


と記述することで、アップロードするファイルの種類を限定させることができます。
input type='file'だけを記述したサンプル

ファイルアップロードコントロールをクリックしてみた

では、XPagesのファイルアップロードコントロールではどのように実装すれば良いのでしょうか?
「ファイルアップロードコントロール」のすべてのプロパティを見ると、「accept」という項目があります。
ここに記述してみました。

ところが・・・
動いてくれません。動くのですが、ファイルの種類が限定されません。

今度は、「ファイルアップロードコントロール」のオプションにある「MIMEタイプ」の値を変更してみました。
ところが・・・
やはり動いてくれません。

何でしょう???
IEでもfirefoxでもchormeでも同様の結果です。


私ができたやり方は
すべてのプロパティにある「attrs」で[+]をクリックして、「attr[0]」にacceptを設定したのでした。
attrの設定

ちなみに、複数のファイルの種類を設定したい場合は、
valueに「@List( "image/gif", "image/jpeg", "image/png" )」と配列になるように書いたら動きました。
この時、ちゃんと「◆値の計算」をクリックして、JavaScript式として書くのを忘れないようにしましょう!

実行結果はこちら。
ファイルの種類を増やしてみた

見事に、pngやjpgが増えています。


ということで、attrに値を設定することで色々とできるようですので、試してみてください。



では、今日はこの辺で。



Web化するならXPages!







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