Python App Engineがアップロードした画像コンテンツタイプ
-
05-07-2019 - |
質問
次のようにApp EngineにPOSTするフォームを作成することで、画像のアップロードを受け入れることができることを知っています:
<form action="/upload_received" enctype="multipart/form-data" method="post">
<div><input type="file" name="img"/></div>
<div><input type="submit" value="Upload Image"></div>
</form>
次に、Pythonコードで次のようなことができます
image = self.request.get("img")
しかし、後でユーザーに表示するときに、この画像のコンテンツタイプがどうあるべきかを知るにはどうすればよいですか?最も堅牢な方法は、画像データ自体からこれを把握することですが、それを簡単に取得する方法は? google.appengine.api imagesパッケージに適切なものが見つかりませんでした。
自分のコードでマジックイメージヘッダーを探す必要がありますか、それとも既にどこかにメソッドがありますか?
編集:
これは私が最終的に使用した単純なソリューションです。私の目的には十分に機能しているようで、画像ストアを別のフィールドとしてデータストアに保存する必要はありません。
# Given an image, returns the mime type or None if could not detect.
def detect_mime_from_image_data(self, image):
if image[1:4] == 'PNG': return 'image/png'
if image[0:3] == 'GIF': return 'image/gif'
if image[6:10] == 'JFIF': return 'image/jpeg'
return None
解決
self.request.get(fieldname)を使用する代わりに、self.request.POST [fieldname]を使用します。これは、「filename」、「type」、および「value」属性を持つcgi.FieldStorageオブジェクト(詳細についてはPythonライブラリのドキュメントを参照)を返します。
他のヒント
python mimetypesモジュールを試してください。コンテンツタイプとエンコーディングが推測されます
e.g。
&gt;&gt; MIMEタイプのインポート
&gt;&gt; mimetypes.guess_type(&quot; /home/sean/desktop/comedy/30seconds.mp4")
( 'video / mp4'、なし)
調査に基づいて、Internet Explorer(少なくともバージョン6)を除くブラウザーは、ファイルの拡張子を使用してファイルのMIMEタイプを決定します。画像のMIMEタイプが必要な場合は、簡単なPython辞書を使用してこれを実現できます。
残念ながら、魔法のバイト( fileinfo はPHPで実行されます)。おそらく、Google appengine image APIを使用してEAFP(許可よりも簡単に許可を求める)原則を適用できます。
はい、画像APIはロードした画像のタイプを通知しないようです。この場合、私はそのPython辞書を作成して、ファイル拡張子をイメージMIMEタイプにマッピングし、 NotImageError()
例外を想定してイメージをロードしようとします。すべてがうまくいけば、MIMEタイプは問題ないと思います。