あなたの目標は何ですか?あなたは本当のmimeタイプが欲しいですか?これはセキュリティ上の理由から重要ですか?それとも「持っていてよかった」ですか?
問題は、同じファイルが異なるmimeタイプを持つ可能性があることです。スクリプトファイルに適切な#!
ヘッダーがある場合、python-magicはスクリプトタイプを判別して通知します。ヘッダーが欠落している場合は、text/plain
取得できる最善の方法である可能性があります。
これは、(モジュールの名前にもかかわらず)一般的な「常に機能する」魔法の解決策がないことを意味します。あなたは座って、あなたが得ることができる情報、それが何を意味するのか、そしてあなたがそれをどのように扱いたいのかを考えなければならないでしょう。
安全な解決策は、受け入れるmimeタイプのリストを作成し、それらをチェックすることです。
allowed_mime_types = [ ... ]
if m in allowed_mime_types:
つまり、完全一致のみが受け入れられます。また、サーバーが何らかの理由で正しいmimeタイプを持たない有効なファイルを拒否することも意味します(ヘッダーがない、マジックがファイルを認識できなかった、リストにmimeタイプを記載し忘れた)。
言い換えれば、本当に気にしないのに、なぜファイルのmimeタイプをチェックするのですか?
[編集]あなたが言うとき
そのテキスト表現をプレーンテキストとして安全に表示できるかどうか、ファイルごとに知る必要があります。
そうすると、これは思ったほど簡単ではありません。まず、「テキスト」ファイルにはエンコードが保存されていないため、ユーザーがファイルを作成したときに使用したエンコードを知っておく必要があります。これは簡単な作業ではありません。これを行うにはヒューリスティックがありますが、ISO 8859-1や8859-15などのエンコーディングを使用すると問題が発生します(後者にはユーロ記号が付いています)。
これを修正するには、ユーザーにテキストファイルを特定のエンコーディングで保存するように強制するか(UTF-8
現在は最良の選択です)、ユーザーがテキストを貼り付けるフォームを提供する必要があります。
フォームを使用すると、ユーザーはテキストが正しくエンコードされているかどうかを確認でき(画面に表示されます)、問題を修正でき、ブラウザーがUTF-8でエンコードされたテキストを送信することを確認できます。
それができない場合は、入力で0x20未満のバイトをチェックするしかありません。ただし\r
、\n
とは例外です\t
。これは、「これはテキストドキュメントですか」のかなり良いチェックです。
しかし、ユーザーがウムラウトを使用する場合(世界中で使用されているアプリケーションを作成する場合など)、ユーザー側で特定のエンコーディングを適用できない限り、このアプローチは最終的に失敗します(信頼できないため、おそらくできません。ユーザー)。
[EDIT2]実際のソースコードをチェックするためにこれが必要なので:ソースコードが「安全」であることを確認したい場合は、それを解析します。ほとんどの言語では、実際にコードを実行せずにコードを解析できます。それはあなたにいくつかの本当の情報を与えるでしょう(パーサーは何を探すべきかを知っているので)そしてあなたは野生の推測をする必要はないでしょう:-)