[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 | |
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側で拡張子を変更するだけで偽装できてしまうので、確実なチェックをしようと思うと、別アプローチが必要になるかと思います。