マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

簡単なアップローダ

Wicketで簡単なアップローダを作ってみた。単純にファイルをアップロードされたファイルを保存するだけの簡単な物にした。いつかWicket-jaのwikiにいろいろ書き込むためにもブログで練習しておかないとな


まずはHTML(UploadPage.html)、単純にエラーメッセージ表示用のfeedbackとform置いてファイル選択とサブミットボタンをフォームにのせただけ

<html>
  <head>
    <title>アップローダ</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body>
      <span wicket:id="feedback"></span>
      <form wicket:id="uploadForm">
          アップロードファイル: 
          <input type="file" value="" wicket:id="uploadField" />
          <input type="submit" value="送信" wicket:id="uploadButton" />
      </form>
  </body>
</html>



次に上のHTMLに対応するJavaのソース(UploadPage.java)

package d_kami.upload;

import org.apache.wicket.protocol.http.WebApplication;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.upload.FileUploadField;
import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.markup.html.panel.FeedbackPanel;

import org.apache.wicket.util.lang.Bytes;

import java.io.File;
import java.io.IOException;

public class UploadPage extends WebPage{
    public UploadPage(){
        FeedbackPanel feedback = new FeedbackPanel("feedback");
        Form form = new Form("uploadForm");
        final FileUploadField uploadField = new FileUploadField("uploadField");
        
        //ファイルのアップロードに必要な設定
        form.setMultiPart(true);
        //アップロードできるのは10キロバイトまで
        form.setMaxSize(Bytes.kilobytes(10));
        
        Button submitButton = new Button("uploadButton"){
            @Override
            public void onSubmit(){
                FileUpload upload = uploadField.getFileUpload();
                //ローカルファイルが無かった場合などは何もしない
                if(upload == null)
                    return;

                //アップロードしたファイルを置くディレクトリのパスを決める
                WebApplication application = (WebApplication)getApplication();
                String uploadPath = application.getServletContext().getRealPath("upload");
                
                File uploadDir = new File(uploadPath);
                //ディレクトリが無ければ作成
                if(!uploadDir.exists())
                    uploadDir.mkdir();
               
                //アップロードしたファイルの名前を取得
                String fileName = upload.getClientFileName();
                File uploadFile = new File(uploadDir, fileName);
                
                try{
                    //アップロードされたクライアントのファイルをサーバーのファイルに書き込む
                    upload.writeTo(uploadFile);
                }catch(IOException e){
                    //例外がでたら、FeedbackPanelにエラーメッセージを表示する
                    this.error(e.getMessage());
                }
            }
        };
        
        add(feedback);
        
        form.add(uploadField);
        form.add(submitButton);
        add(form);
    }
}



最後にApplicationクラス。

package d_kami.upload;

import org.apache.wicket.protocol.http.WebApplication;

public class UploadApplication extends WebApplication{
    @Override
    public Class getHomePage(){
        return UploadPage.class;
    }
}



一応フィルタマッピング

    <filter>
        <filter-name>UploadApplication</filter-name>
        <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
        <init-param>
            <param-name>applicationClassName</param-name>
            <param-value>d_kami.upload.UploadApplication</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>UploadApplication</filter-name>
        <url-pattern>/upload/*</url-pattern>
    </filter-mapping>