こんばんは爆  笑

 

久々の投稿です笑い泣き

そして久々に新規開発をやってますキラキラ

なかなか本業の開発に時間を費やせない今年ですが、

自分のための覚書として残りの日々、色々な記事を残していこうと思いますグー

 

今回は「ファイルを添付させる際に、サイズ制限したい」という要望がありました。

こんな感じですニコニコ

 

XPagesのファイルアップロード/ダウンロードコントロールをうまく使うと

そのようなことが出来ると聞いたことがあったのですが、

どこに書いてあったかを失念ガーン

 

見つからないから試しに簡易的に作ってみたという個人的な覚書ですアセアセ

 

さて本題に・・・

XPagesでファイルをアップロード→更新すると

ダウンロードコントロールは以下のように表示されます。

目に見える状態でサイズが書いてありますねおねがい

この情報をJavascriptでうまくとればなんとかなりそうです!

 

ソースを見てみました目

 

あれ?IDじゃない・・・ポーン

 

もう一つファイルを添付してソースを確認してみました目

 

ふぁ!?

どうやらクラス名で取得しなければならないようですねアセアセ

 

グーグル先生で調べてみると「getElementsByClassName」というので

取得できるようでしたキョロキョロ

https://developer.mozilla.org/ja/docs/Web/API/Document/getElementsByClassName

 

という事でやってみましたグー

サイズ→ファイル名→作成日時→削除と表示され

image/jpeg・・・

 

お、取れた!

 

IMG_3683.JPG→2020/0718 14:14 と準備取れ・・・

ゴミ箱アイコンはスキップされてimage/jpeg・・・

 

 

取れた!

IMG_5260.JPG→2020/0718 14:15と表示され終了しました拍手

 

 

まとめると・・・

ファイルタイプから始まる行は

ファイルタイプ、サイズ、ファイル名、作成日時、削除(見えていない)の5項目が取得され

2行目から

<ファイルタイプ>、<サイズ>、<ファイル名>、<作成日時>と4項目が取得されました。

 

ファイルダウンロードコントロールの以下の表記の場合は

For文を5からスタートし、6で割り切れる場合に値を取ればうまくいきそうです。

 

実際にやってみると

 

うまく取れました拍手

(自信がなかったのでファイル増やしてみました)

 

 

あとは取れた値を変数に入れて足し算して閾値と比較すればいいのですが

どうも取れている値が「文字」なのでreplaceとNumberを使って数値化してから

変数に入れないといけませんね注意

 

その点に注意しながら出来たものがこちら下矢印下矢印下矢印

合計値取れていると思いますグッ

(桁を増やすためにファイルを変更してみました)

 

最後の仕上げとして、2MB(ここではわかりやすく2000KBにしています)以上なら

警告を出して処理を中断するという仕組みにしたいと思います。

 

この状態は2MB未満なので[保存する]ボタンをクリックしても警告は出ませんOK

 

大きな容量のファイルを添付して[保存ボタン]をクリックすると・・・

「添付サイズオーバーです」と警告が出ているのがわかりますでしょうか??

 

以下、今回のブログ用に作成したXPageです(汚いですが)

 

        <xp:label value="添付ファイルのサイズは2MB未満でお願いします!" id="label1"
            style="color:rgb(255,0,0);font-weight:bold">
        </xp:label>

        <xp:br></xp:br>
        <xp:panel id="imagePanel">
            <xp:this.data>
                <xp:dominoDocument var="document1" formName="ImageSize"
                    computeWithForm="both">
                </xp:dominoDocument>
            </xp:this.data>

            添付ファイル:<xp:fileUpload id="fileUpload1" value="#{document1.Body}">

                <xp:eventHandler event="onchange" submit="true"
                    refreshMode="complete">
                </xp:eventHandler>
            </xp:fileUpload>
            <xp:fileDownload rows="30" id="fileDownload1"
                displayLastModified="false" value="#{document1.Body}"
                hideWhen="true" allowDelete="true">
            </xp:fileDownload>
        </xp:panel>
        <div id="alertMsg" style="color:red"></div>
        <br/><br/><xp:button value="保存する" id="button1">
            
        <xp:eventHandler event="onclick" submit="false">
            <xp:this.script><![CDATA[var tmpList = document.getElementsByClassName('xspTextComputedField');
var cnt = 6;
var tmpSize = 0;
document.getElementById("alertMsg").innerHTML = ""

for (var i = 5; i < tmpList.length; i++) {

    if(cnt == i){
        tmpSize += Number(tmpList[i].innerHTML.replace(/,/g, '').replace(/KB/g, ''))
        cnt += 4;
    };
};

if(tmpSize >=2000){
    document.getElementById("alertMsg").innerHTML = "添付サイズオーバーです!";
    return false;
};
]]></xp:this.script>
        </xp:eventHandler></xp:button>

 

もっと簡単な方法があったような気もしましたが、

今回は上記の方法で実装してみました。

(もしご存知のかたいらっしゃいましたら、コッソリ教えてくださいお願い

 

 

今回はこの辺で・・・

 

 

あでゅーバイバイ