Pergunta

Eu sei que posso aceitar uploads de imagens tendo um formulário que posta para o mecanismo de aplicativo como assim:

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

Então, no código python, eu posso fazer algo como

image = self.request.get("img")

Mas como posso descobrir qual deve ser o tipo de conteúdo desta imagem quando a mostrar mais tarde ao usuário? Parece que a maneira mais robusta seria descobrir isso a partir dos próprios dados da imagem, mas como obter isso facilmente? Não vi nada adequado no pacote de imagens do google.apgengine.api.

Devo procurar apenas os cabeçalhos da imagem mágica em meu próprio código, ou já existe um método para isso em algum lugar?

Editar:

Aqui está a solução simplista que acabei usando, parece funcionar bem o suficiente para meus propósitos e evita a necessidade de armazenar o tipo de imagem como um campo separado no armazenamento de dados:

# 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
Foi útil?

Solução

Em vez de usar self.request.get (FieldName), use self.request.post [fieldname]. Isso retorna um objeto CGI.FieldStorage (consulte os atributos da Biblioteca Python para obter detalhes), que possui atributos de 'nome do arquivo', 'tipo' e 'valor'.

Outras dicas

Experimente o módulo Mimetypes Python, ele adivinhará o tipo de conteúdo e a codificação para você,

por exemplo

>> Importar mimetipos

>> Mimetypes.guess_type ("/home/sean/desktop/comedy/30seconds.mp4")

('Video/mp4', nenhum)

Com base em minha pesquisa, os navegadores, exceto o Internet Explorer (pelo menos versão 6), determine o tipo de mima de arquivo usando a extensão do arquivo. Dado que você deseja que os tipos de MIME de imagem, você pode usar um simples dicionário Python para conseguir isso.

Infelizmente, não conheço nenhum método em python que tenta adivinhar o tipo de imagem lendo alguns bytes mágicos (o caminho informações do arquivo faz no php). Talvez você possa aplicar o princípio do EAFP (mais fácil de pedir perdão do que permissão) com a API da imagem do Google AppEngine.

Sim, parece que a API da imagem não informa o tipo de imagem que você carregou. O que eu faria neste caso é construir esse dicionário Python para mapear extensões de arquivo para imagens de tipos de imagens e tentar carregar a imagem enquanto espera NotImageError() exceção. Se tudo correr bem, presumo que o tipo MIME estivesse ok.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top