画像ファイルを選別するFilenameFilter

公開日: : 最終更新日:2014/01/26 Java

画像ファイルのみアップロードを許可する仕様があって、何てことはないがフィルターを作って対応したのでメモ。似たような要件はよく出てくるのでいつか役に立つときがくるはず。

作成したスニペット

Gist に登録済み。

package net.tomoyamkung;
 
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.List;
 
/**
 * 画像ファイルを選別する FilenameFilter
 * 
 * @author tomoyamkung
 *
 */
public class ImageFileFilter implements FilenameFilter {
 
    /* (non-Javadoc)
     * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String)
     */
    @Override
    public boolean accept(File dir, String fileName) {
        try {
            List extensions = AppProperties.getInstance().getStringList("upload.file.image.extensions");
            for(String extension : extensions) {
                if(fileName.endsWith(extension) || fileName.endsWith(extension.toUpperCase())) {
                    return true;
                }
            }
            return false;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
 
}
package net.tomoyamkung;
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
 
public class AppProperties {
 
    private static AppProperties instance;
    private static final String PROP_FILE_NAME = "app.properties";
    
    private Properties prop;
    
    /**
     * コンストラクタ。
     * 
     * シングルトン。
     * 
     * @throws IOException
     */
    private AppProperties() throws IOException {
        prop = new Properties();
        prop.load(this.getClass().getClassLoader().getResourceAsStream(PROP_FILE_NAME));
    }
    
    /**
     * インスタンスを生成する。
     * 
     * @return AppProperties クラスのインスタンス
     * @throws IOException インスタンスの取得に失敗した場合
     */
    public static synchronized AppProperties getInstance() throws IOException {
        if(instance == null) {
            instance = new AppProperties();
        }
        return instance;
    }
 
    public String get(String key) {
        return prop.getProperty(key).trim();
    }
    
    public List getStringList(String key) {
        String[] array = get(key).split(",");
        List values = new ArrayList(array.length);
        
        for(int i = 0; i < array.length; i++) {
            values.add(array[i].trim());
        }
        return values;
    }
}
# 画像ファイルの許可する拡張子
upload.file.extensions = .jpeg,.jpg,.png,.gif

ファイル構成

  • AppProperties.java
    • プロパティファイルを扱うシングルトン
  • ImageFileFilter.java
    • 画像ファイルを選別する FilenameFilter
  • app.properties
    • 設定を切り出したプロパティファイル

使用したソフトウェアのバージョン

Java のバージョンは次の通り。

$ java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

フィルタ処理について

ImageFileFilter に FilenameFilter を implements させて、accept メソッドをオーバーライドして実装してある。

有効な拡張子はプロパティファイルに定義してあり、一致した文字列で終わっていれば true 、すべて一致しなければ false としている。

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

no image

ファイルの拡張子が JPG であるかを問い合わせるスニペット

特に目新しいこともないが、同じようなことをする機会があるかもしれないのでメモ。Gist にも登録済み

記事を読む

icatch-upload_1229138273_mini-thumbnail

InputStream に格納されているストリームデータのサイズを取得する

Jersey を使った Web アプリを作成中なんですが、 enctype="multipart/f

記事を読む

no image

ディレクトリに関するユーティリティ

ディレクトリに関するスニペットをいくつか書いた。いつかコピペする日が来ると思うのでメモしておく。

記事を読む

no image

画像ファイルのサイズ(縦横じゃなくて容量)を取得するスニペット

File#length で取得できるとは知らなかった。Gist にも登録済み。 /** * 画

記事を読む

no image

Stream#map()とStream#collect()を使ってListを生成する

Java8 から導入された Stream API も少しずつ慣れてきて、「そういえばこういうパターン

記事を読む

no image

Jetty でシンプルなプロジェクトを作成してみた

プロトタイプを作成するなら Tomcat よりも Jetty のほうがさらっと出来そうだなぁ、と今さ

記事を読む

GradleLogoReg

Gradle で Java アプリのプロジェクトを作成して Eclipse にインポートするまでの手順

Mac に SDKMAN! を使って Gradle をインストールしたので、実際にプロジェクトを作成

記事を読む

medium_2055608272

指定した年月の日付を Calendar オブジェクトの一覧で取得する

小ワザです。 業務で、指定した年月の日付を Calendar オブジェクトの一覧で取得する必要があり

記事を読む

no image

サーブレットでクラスパス上にあるプロパティファイルを参照するスニペット

よく使うわりにはいつも調べているのでいい加減メモすることにした。 "app.proper

記事を読む

no image

Java から VBScript を使って Excel を印刷する

背景 Java のデスクトップアプリを作成していたときの要件に「Excel で作成された帳票を印刷

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


− 5 = 二

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑