システム要件で意外とファイルアップロードの要件は少ないもので、今まで気づかなかったのですが、
ドラッグ操作でファイルアップロードする(処理)振る舞いを Wicket-extension は、すでにあったのですね。
wicket-extensions-8.0.0.jar の中にありますね。
今でもそうなのか、<input> タグ type="file" formタグを、method="post" enctype="multipart/form-data" なんて書いて
殆どが、実装しているのでは?
でも、Wicket-extension では、そんなこと書かなくても、
form タグは、<form wicket:id="form"> のままの記述で、<input> タグ type="file" も書かずに、
適当にページデザインで、ドラッグ&ドロップする場所作って、
AjaxFileDropBehavior というビヘビアを書けば、
ファイルをマウスでドラッグ操作すると、勝手にファイルアップロード実行して、サーバサイドで読み込めます。
(サンプル)
まず、これは無くてもいいんですが、現在のファイルアップロード状況をページに表示するテキスト宣言を
グローバル変数 public で持ちます。。
public String filelistText = "";
ファイルアップロード状況のラベルです。グローバル変数 で filelistText を宣言したので、LambdaModel で書きます。
setOutputMarkupId で true にして後から結果を反映させます。
/* ファイルアップロード状態テキスト */ Label filelistTextLabel = new Label("uploadfiles_list", LambdaModel.of(()->filelistText, t->{ filelistText = t; })); filelistTextLabel.setEscapeModelStrings(false); filelistTextLabel.setOutputMarkupId(true); queue(filelistTextLabel);
div タグなど、適当スペースのタグにAjaxFileDropBehavior を割り当てます。読み込んでサイズを認識してます。
WebMarkupContainer droparea = new WebMarkupContainer("droparea"); droparea.add(new AjaxFileDropBehavior(){ protected void onFileUpload(AjaxRequestTarget target, List<FileUpload> files){ Optional.ofNullable(files).ifPresent(fu->{ StringBuilder sb = new StringBuilder(); sb.append("<ul>"); fu.stream().forEach(file->{ sb.append("<li>"); sb.append(file.getClientFileName()); sb.append(" Size: "); sb.append(Bytes.bytes(file.getSize()).toString()); sb.append(" byte"); sb.append("</li>"); }); sb.append("</ul>"); filelistText = sb.toString(); target.add(filelistTextLabel); }); } @Override protected void onError(AjaxRequestTarget target, FileUploadException fux) { logger.debug(fux.getMessage()); } }); queue(droparea);
これだけです。
Wicket は基本ステートフルなので、あとは煮るなり焼くなり好きにします。
さらに、以下のとおり誤った操作でドロップした時の対処も必要、
oboe2uran.hatenablog.com