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

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

簡単なアップローダ その2

前回作った物はただファイルをアップロードするだけだったので、今度はアップロードされたファイルの一覧を表示する機能を付けた。ファイルの並び順が日付順になってないのと、ダウンロード機能、排他制御未実装

UploadPage.html

<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>
      
      <table style="width:100%">
          <tr>
             <td>ファイル名</td>
             <td style="text-align:right;padding-right:10px">ファイルサイズ</td>
             <td>更新日</td>
          </tr>
          <tr wicket:id="uploadList">
              <td wicket:id="fileName" style="width:100px"></td>
              <td wicket:id="fileSize" style="text-align:right;padding-right:10px"></td>
              <td wicket:id="uploadTime"></td>
          </tr>
      </table>
  </body>
</html>


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.basic.Label;
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.list.ListView;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.panel.FeedbackPanel;

import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.util.lang.Bytes;

import java.util.Arrays;
import java.util.Date;
import java.text.SimpleDateFormat;

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));
        
        final File uploadDir = getDirectory("upload");
        
        Button submitButton = new Button("uploadButton"){
            @Override
            public void onSubmit(){
                FileUpload upload = uploadField.getFileUpload();
                if(upload == null){
                    /*
                     アップロードするファイルが見つからなければエラーメッセージ表示
                     して後は何もしない
                    */
                    error("アップロードするファイルが見つかりません");
                    return;
                }
               
                //アップロードしたファイルの名前を取得
                String fileName = upload.getClientFileName();
                File uploadFile = new File(uploadDir, fileName);
                
                try{
                    //アップロードされたクライアントのファイルをサーバーのファイルに書き込む
                    upload.writeTo(uploadFile);
                }catch(IOException e){
                    //例外がでたら、FeedbackPanelにエラーメッセージを表示する
                    this.error(e.getMessage());
                }
            }
        };
        
        //アップロードされたファイルの一覧を返すモデル
        IModel uploadListModel = new LoadableDetachableModel(){
            @Override
            protected Object load() {
                //アップロードされたファイルのリスト(一覧)を返す
                return Arrays.asList(uploadDir.listFiles());
            }
        };
        
        //アップロードされたファイルの一覧を表示するListView
        ListView listView = new ListView("uploadList", uploadListModel){
            @Override
            public void populateItem(ListItem listItem){
                File file = (File)listItem.getModelObject();
                listItem.add(new Label("fileName", file.getName()));
                listItem.add(new Label("fileSize", file.length() +"B"));
                
                Date date = new Date(file.lastModified());
                SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm");
                listItem.add(new Label("uploadTime", format.format(date)));
            }
        };
        
        add(feedback);
        
        form.add(uploadField);
        form.add(submitButton);
        add(form);
        add(listView);
    }
    
    private File getDirectory(String dirName){
        WebApplication application = (WebApplication)getApplication();
        String uploadPath = application.getServletContext().getRealPath(dirName);
        File dir = new File(uploadPath);

        if(!dir.exists())
            dir.mkdir();
        
        return dir;
    }
}