Python App Engine загрузил изображение типа контента - PullRequest
4 голосов
/ 11 сентября 2009

Я знаю, что могу принимать загрузки изображений, используя форму, которая отправляет сообщения в 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

Ответы [ 3 ]

5 голосов
/ 11 сентября 2009

Вместо использования self.request.get (fieldname) используйте self.request.POST [fieldname]. Это возвращает объект cgi.FieldStorage (подробности см. В документации по библиотеке Python), который имеет атрибуты «filename», «type» и «value».

2 голосов
/ 30 сентября 2009

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

, например

>> импортные миметипы

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

('video / mp4', None)

0 голосов
/ 11 сентября 2009

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

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

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

...