読者です 読者をやめる 読者になる 読者になる

Wicket 6.x→7.x でファイルダウンロード時のファイル名の注意

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));