0

文字列を他の文字列、具体的には拡張子または MIME タイプをファイルのタイプに一致させる必要があります。たとえば、「png」、「image/png」、「image/jpeg」は「image」などと一致する必要があります。

現在、私はこの方法を使用しています:

fileFormats = {
    'image/png':'image',
    'image/jpeg':'image',
    'png':'image',
    'jpeg':'image',
    'jpg':'image'
}

fileFormats["png"]

ただし、拡張機能/MIME タイプの数が増えると、これがかなり繰り返される可能性があります。また、これを行うためのより良い方法があるべきだと思います。何か案は?

4

2 に答える 2

1

形式名から MIME タイプおよび/またはファイル拡張子へのマップを作成する場合、繰り返しがあってはなりません。その後、リストを反転できます。

mimeTypes = {
    'image' : ['image/png', 'image/jpeg', 'png', 'jpeg', 'jpg', ...],
    'text'  : [ . . .],
    . . .
}
fileFormats = {};
for (type in mimeTypes) {
    mimeList = mimeTypes[type];
    for (i = 0, n = mimeList.length; i < n; ++i) {
        fileFormats[mimeList[i]] = type;
    }
}
于 2013-08-19T06:53:16.403 に答える
0

そうではありませんが、ある時点で辞書/マップが必要になります。

私の最初のコメントは、MIME とファイル拡張子を同じマップに混在させてはならないということです。代わりに、2 つのマップが必要です。

extensionToMime = {};
mimeToExtension = {};

2 番目のコメントは、1 つの拡張機能に複数の MIME を含めることができるため、extensionToMime マップの値は配列にする必要があるということです。

ただし、マップの使用を本当に避けたい場合 (結果が O(1) で返されるため、高速化するのは困難です)、拡張子に応じて MIME タイプを構築するためのいくつかのルールを理解することができます。例えば:

 var simpleMimes = { "png":true, "jpeg":true, "gif":true }; // mimicking a set
 // then, when you need it:
 function getMimeFromExtension(ext) {
   if (ext in simpleMimes) {
     return "image/" + ext;
   }
   return extensionToMime[ext];
 }

これは明らかにすべての拡張機能で可能というわけではなく、このように簡単に構築できる少数の MIME で作業している場合にのみ機能します。

于 2013-08-19T06:53:10.333 に答える