2

そのため、アップロードのユーザー オプションを特定のファイル拡張子のリストに制限したいと考えています。これは純粋にユーザーにとって使いやすくするためです。サーバーでのファイルタイプのアップロードも既に制限しています。

拡張子のリストはありますが、MIME タイプのリストはありません。受け入れられた拡張機能は潜在的に変更される可能性があるため、MIME タイプを動的に計算する完全に信頼できる方法はありません (むしろこれを避けたいと思います)。代わりに、拡張機能を要素の「accept」属性にフィードしたいと思います<input type="file">

これは Chrome では意図したとおりに機能しますが、FF や IE10 では機能しないことに気付きました (これらのブラウザーでは、すべてのファイルにフォールバックしているようです)。

これは標準の一部ではないことを認識していますが、(最新のブラウザー) クロスブラウザー フレンドリーな 'accept' 属性で MIME タイプの代わりに拡張機能を受け入れる方法はありますか? 使用したテストケース<input type="file" accept=".doc,.docx,.bad" />

これが不可能な場合、最善のアプローチは何ですか? 注: サーバー レジストリに使用する拡張機能のすべての MIME タイプが含まれるという保証はありません。このリストは非常に長くなる可能性があるため、MIME タイプのリストを手動で最新の状態に保つことは実際的ではありません (最後の手段になります)。 .

4

1 に答える 1

3

いいえ、安全ではありません。HTML 4.01accept属性は、値がメディア タイプのコンマ区切りリストになるように定義されています。これも比較的最近実装されました (たとえば、IE 9 ではサポートされていません)。

HTML5 ドラフトでは、この属性は (最近) 拡張子も使用できるように拡張されており、ファイル入力に関する HTML5 CR の説明では次のように推奨されています。特定のフォーマット。」ただし、これはまだ広く実装されていません。

また、概念的に非常に面倒です。メディアの種類は、ファイルやその他のデータの種類を指定する標準化された相互運用的な方法であることを意図して設計されています。ファイル名拡張子は、いくつかのシステムで特別な方法で扱われるファイル名の一部にすぎず、標準がなく、あまり一貫性のない一般的な慣行を超えています。この 2 つを混在させると問題が発生しますが、これには実際的な理由がいくつかあります。

いずれにせよ、ファイル入力では、ファイル拡張子とメディア タイプ間のマッピングは、ユーザーのコンピューターの基本的なオペレーティング システムとファイル システムと共に、ブラウザーによって実行されます。サーバーは関与しません。

File APIを使用すると、それをサポートするブラウザー (Firefox など) で、選択したファイルのファイル名をチェックアウトし、ファイル名の拡張子を取得して、選択したファイルが)はお受けできません。しかし、これはファイル選択ウィジェットに影響を与えずに選択に発生し、ユーザーに選択を変更するよう求めることしかできませんでした。

于 2013-02-11T06:48:09.510 に答える