2009-09-11 2 views
4

Я знаю, что я могу принять загрузку изображений, имея форму, публикующие в App Engine, как так:Python App Engine загружен изображение типа содержимого

<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.

Должен ли я просто искать магические заголовки изображений в своем собственном коде или есть какой-то метод для этого где-то?

Edit:

Вот упрощенное решение, которое я закончил с использованием, кажется, работает достаточно хорошо для моих целей и избавляет от необходимости хранить тип изображения в качестве отдельного поля в хранилище данных:

# 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 (имя поля), используйте self.request.POST [имя поля]. Это возвращает объект cgi.FieldStorage (подробности см. В документах библиотеки Python), который имеет атрибуты «имя файла», «тип» и «значение».

+0

Пожалуйста post link – crizCraig

+0

Это дает мне ошибку «AttributeError: экземпляр UnicodeMultiDict не имеет метода __call__» – zakdances

+1

@yourfriendzak Вы по-прежнему используете parens '()', а не квадратные скобки '[]'. –

0

Основываясь на моих исследованиях, браузеры, за исключением Internet Explorer (как минимум, 6), определяют тип файла mime с помощью расширения файла. Учитывая, что вам нужны типы изображений mime, вы можете использовать простой словарь Python для достижения этого.

К сожалению, я не знаю ни одного метода в Python, который пытается угадать тип изображения, читая некоторые магические байты (способ fileinfo делает в PHP). Возможно, вы можете применить принцип EAFP (проще для запроса прощения, чем разрешения) с API-интерфейсом API appengine.

Да, похоже, что API-интерфейс изображения не сообщает вам тип загруженного изображения. Что бы я делал в этом случае, это построить этот словарь Python для сопоставления расширений файлов с типом изображений mime и попробуйте загрузить изображение, ожидая исключения NotImageError(). Если все пойдет хорошо, то я предполагаю, что тип мим был в порядке.

2

Попробуйте модуль питона Mimetypes, он догадается, тип содержимого и кодировку для вас,

например

>> импорт MIMETYPES

>> mimetypes.guess_type ("/ дом/Sean/настольные/комедия/30seconds.mp4")

('видео/mp4', None)