Wicket でファイルダウンロードのファイル名を日本語を使用する場合、Wicket 6.x では
URLエンコードしていた。
Wicket 7.x 移行では必要ないことに気がついた。
scheduleRequestHandlerAfterCurrent を使う場合。。
try(IResourceStreamWriter writer = new AbstractResourceStreamWriter(){ @Override public void write(OutputStream out) throws IOException{ // OutputStream に出力する。 out.flush(); out.close(); } @Override public String getContentType() { // 返す ContentType を指定 return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; } }){ getRequestCycle().scheduleRequestHandlerAfterCurrent( new ResourceStreamRequestHandler(writer, "サンプル.xlsx") ); }catch(Exception e){ // エラー捕捉 }
Wicket 6.x では、
new ResourceStreamRequestHandler(writer, URLEncoder.encode("サンプル.xlsx", "UTF-8")
と書いていた。。
AjaxBehavior による ダウンロードも以下の抽象クラスを用意することになる
import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.behavior.AbstractAjaxBehavior; import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler; import org.apache.wicket.request.resource.ContentDisposition; import org.apache.wicket.util.resource.IResourceStream; /** * AJAXDownload. */ public abstract class AJAXDownload extends AbstractAjaxBehavior{ protected abstract IResourceStream getResourceStream(); public void callBackDownload(AjaxRequestTarget target){ target.appendJavaScript("setTimeout(\"window.location.href='" + getCallbackUrl().toString() + "'\", 100);"); } @Override public void onRequest(){ try{ ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(getResourceStream(), getFileName()); handler.setContentDisposition(ContentDisposition.ATTACHMENT); getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(handler); }catch(Exception e){ throw new RuntimeException(e.getMessage(), e); } } protected String getFileName(){ return null; } }
使う時、、、
final AJAXDownload download = new AJAXDownload(){ @Override protected IResourceStream getResourceStream(){ return new AbstractResourceStreamWriter(){ @Override public void write(OutputStream out){ try{ // TODO OutputStream に出力 out.flush(); out.close(); }catch(Exception e){ throw new RuntimeException(e); } } @Override public String getContentType() { return "application/pdf"; } }; } @Override protected String getFileName() { return downloadname +".pdf"; } }; queue(new AjaxButton("download"){ @Override protected void onSubmit(AjaxRequestTarget target, Form<?> f){ download.callBackDownload(target); } }.add(download));