[SalesForce]apex:inputFileで添付されたファイルの種類をチェックする

添付されたファイルが指定のものかどうかをチェックする。

1.inputタグのacceptで制限

一番簡単な方法だけど、ブラウザによっては効かないものもあり。
salseforce独自の方法というわけではなく、一般的なもの。

accept 属性でアップロードするファイルフォーマットを指定

2.contenttypeを取得

以下のように指定することで、選択されたファイルのcontenttype (MIMEタイプ)を取得出来る。

[VisualForce]

<apex:inputFile fileName="{!upload.name}" value="{!upload.body}" contentType="{!upload.contentType}" />

[apexクラス]

//Documentに保存する場合
public Document upload { get; set; }

//確認ボタンが押された場合
public Pagereference confirm() {
    String ctype = upload.ContentType; //ContentTypeを取得
    if(ctype != 'image/jpeg'){
        // エラーにする
    }
}

以下、主なcontenttype。(METAタイプ)

contenttype 種類
image/jpeg JPG画像
application/pdf PDF
application/vnd.ms-excel エクセル(.xls)
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet エクセル(.xlsx)
application/msword ワード(.doc)
application/vnd.openxmlformats-officedocument.wordprocessingml.document ワード(.docx)

ただし、macでエクセルなどを添付した場合に、このcontenttypeが、
application/octet-streamになってしまった場合があった。
このタイプはファイルタイプが不明、の場合になるよう。
(たぶん、使用しているPCが不明なタイプと判断している場合にそうなる可能性がある)

その場合には、拡張子で判断するようにした。

3.拡張子で判断

単純に、ファイル名から、ドットで区切って文字列を取得。
その文字列と判定、とした。
上記のapexクラスに追記

if(ctype != 'image/jpeg'){
    if(ctype == 'application/octet-stream'){
        List<String> names = upload.Name.split('\\.');
        String dotex = names[names.size() - 1];
        if(dotex != 'jpg'){
            //エラー
        }
    }else{
        //エラー
    }
}

まとめ

これで単純に、ファイルタイプと拡張子によるチェックは出来るかと思います。
が、PC側で拡張子を変更するだけで偽装できてしまうので、確実なチェックをしようと思うと、別アプローチが必要になるかと思います。

   このエントリーをはてなブックマークに追加