2009-09-11 103 views
4

我知道,我可以有一個表單,POST到App Engine的,像這樣接受圖片上傳:Python應用程序引擎上傳的圖片內容類型

<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圖片包中沒有看到任何適合的內容。

我應該只是在我自己的代碼中尋找魔法圖像標題,或者是否已經存在某種方法?

編輯:

下面是簡單的解決方案,我結束了使用,似乎工作不夠好,我的目的,避免了對圖像類型存儲作爲數據存儲在不同的領域:

# 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 

回答

5

不使用self.request.get(fieldname),而是使用self.request.POST [fieldname]。這將返回一個cgi.FieldStorage對象(詳見Python庫文檔),它具有'文件名','類型'和'值'屬性。

+0

請帖子鏈接 – crizCraig 2011-05-27 18:30:44

+0

這給了我錯誤「AttributeError:UnicodeMultiDict實例沒有__call__方法」 – zakdances 2011-10-14 02:35:34

+1

@yourfriendzak你仍然使用parens'()',而不是方括號'[]'。 – 2011-10-16 07:28:05

0

根據我的研究,除Internet Explorer(至少版本6)之外,瀏覽器通過使用文件的擴展名來確定文件MIME類型。鑑於你想要圖像MIME類型,你可以使用一個簡單的Python字典來實現這一點。

不幸的是,我不知道Python中的任何方法試圖通過讀取一些魔法字節來猜測圖像類型(在fileinfo中的方式)。也許你可以使用Google appengine圖像API來應用EAFP(容易提出寬恕而不是權限)原則。

是的,它似乎是圖像API不告訴你已經加載的圖像的類型。在這種情況下,我會做的是構建Python字典,以將文件擴展名映射到圖像MIME類型,並嘗試加載圖像,同時期望產生NotImageError()異常。如果一切順利,那麼我認爲MIME類型是OK的。

2

嘗試python的MIME類型模塊,它會猜測內容類型和編碼對你來說,

例如

>>進口MIME類型

>> mimetypes.guess_type( 「/家/肖恩/桌面/喜劇/ 30seconds.mp4」)

( '視頻/ MP4',無)

相關問題