html5で複数ファイルアップロード(SAStruts)その3

チュートリアルに存在するファイルアップロードをベースとして機能を拡充していく。

Super Agile Struts - Tutorial

前回、解析を終えて、テキストパラメータはいい感じに配列にしてくれるけど、 FormFileは複数のパラメータがひとつのフォーム名で送られることを想定していない様子だった。

今回は解決編。 テキストパラメータの記述をパクってやりましょう!

S2MultipartRequestHandlerの拡張クラスを作ります。

S2MultipartRequestHandlerCustom.java

package net.negimiso.struts.upload;

import org.apache.commons.fileupload.FileItem;
import org.apache.struts.upload.FormFile;
import org.seasar.struts.upload.S2MultipartRequestHandler;

public class S2MultipartRequestHandlerCustom extends S2MultipartRequestHandler {

    @SuppressWarnings("unchecked")
    @Override
    protected void addFileParameter(FileItem item) {
        // FormFile formFile = new S2FormFile(item);
        //
        // elementsFile.put(item.getFieldName(), formFile);
        // elementsAll.put(item.getFieldName(), formFile);
        String name = item.getFieldName();
        FormFile value = new S2FormFile(item);

        FormFile[] oldArray = (FormFile[]) elementsFile.get(name);
        FormFile[] newArray;
        if (oldArray != null) {
            newArray = new FormFile[oldArray.length + 1];
            System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
            newArray[oldArray.length] = value;
        } else {
            newArray = new FormFile[] { value };
        }
        elementsFile.put(name, newArray);
        elementsAll.put(name, newArray);
    }
}

必要最低限のオーバーライド。 やってる事はテキストフィールドのそれと同じ。 基本的に単一だろうと複数だろうと配列として保存しておく。

次は、作成したハンドラクラスを読み込んでもらうように、 Struts設定ファイルを修正。

struts-config.xml

    <controller
        maxFileSize="1024M"
        bufferSize="1024"
        processorClass="org.seasar.struts.action.S2RequestProcessor"
        multipartClass="net.negimiso.struts.upload.S2MultipartRequestHandlerCustom"/>

これで一通りの対策は完了。 文字に起こすとアッサリしてるなぁ。。。

最後に動作確認。

f:id:negiblog:20160612235256p:plain

f:id:negiblog:20160612235304p:plain

f:id:negiblog:20160612235311p:plain

f:id:negiblog:20160612235318p:plain

f:id:negiblog:20160612235325p:plain

おーほんとに上がった。 よかったよかった。

(うーん、こんな修正でいいのか?)