2014-01-10 186 views
7

私はデコードしてDjangoのImageFieldに保存するbase64でエンコードされた画像を持っています。ファイルにランダムな名前を付けたいのですが、ファイル拡張子がわかりません。Pythonでbase64でエンコードされた画像のファイル拡張子を見つける方法

文字列の先頭に「data:image/png; base64」があり、mimetypeを抽出するための正規表現を使用できることがわかっていますが、そこからベストプラクティスの方法があるかどうかを知りたいのですが"data:image/png; base64"を ".png"に確実に変換します。誰かが突然私がサポートしていない奇妙なイメージファイルタイプをアップロードしたいときに、私のhandspun機能を中断させたくありません。

+0

は、Python 3.4で 'DataHandler'がありますが。 [そのソースコードは、データURLを解析するのが簡単であることを示唆している](http://hg.python.org/cpython/file/1f3242fb0c9c/Lib/urllib/request.py#l1527)すべてのケースで 'image/png'を抽出する(「引用符で囲まれた文字列」表現を用いたあいまいさを無視する)(http://www.rfc-editor.org/errata_search.php?rfc=2397))。 – jfs

答えて

4

ファイルの内容に依存するのではなく、ファイルの内容を調べることをお勧めします。たとえば、多くの電子メール攻撃では、疑いのないコンピュータが実行すべきでないファイルを実行するようにMIMEタイプを誤って識別することに頼っています。幸いにも、ほとんどの画像ファイル拡張子は、最初の数バイト(base64のデコード後)を見ることで判断できます。ただし、this onethis oneなどのPythonパッケージでアクセスできるfile magicを使用するのがベストプラクティスです。

ほとんどの画像ファイル拡張子は、mimetypeから明らかです。 gif、pxc、png、tiff、jpegの場合、ファイル拡張子はMIMEタイプの 'image /'部分に続くものです。 - 仕事をする必要がありますhttp://docs.python.org/2/library/mimetypes.html

基本的にmimetypes.guess_extension(mine)

>>> from mimetypes import guess_extension 
>>> guess_extension('image/x-corelphotopaint') 
'.cpt' 
>>> guess_extension('image/png') 
'.png' 
+0

mimetypeは既にあります。libmagicを使用すると、mimetypeが見つかるだけで、拡張子は示されません。 – Graeme

+0

'filemagic'を介してMIMEタイプを取得する方が、提供されたMIMEタイプを直接使用するよりも安全であることを示唆していますか? – jfs

+0

@ J.F.Sebastian私の経験では、敵対的ではない電子メールであっても、提供されるファイルタイプの多くは間違っています。提供されたMIMEタイプは、ファイル拡張子のテーブルルックアップだけであったかもしれません。 – John1024

1

あなたはMIMEタイプのモジュールを使用することができます。また、曖昧なタイプを処理するために、Pythonは標準パッケージを提供します。

2

mimetypes stdlib moduleもPythonの2のデータのURLサポートのように見えます:

>>> from mimetypes import guess_extension, guess_type 
>>> guess_extension(guess_type("data:image/png;base64,")[0]) 
'.png' 
+0

'image/jpeg' =( –

+0

)を返すと '.jpe'が返されます。チェックしたブラウザ(Chrome、Firefox、Safari)にはこのような名前のファイルが表示されるため、。 –

関連する問題