Modificar campos ao fazer upload de uma imagem? Web2Py é tão difícil assim?

80 views
Skip to first unread message

Alex BENFICA

unread,
Apr 20, 2012, 7:58:46 PM4/20/12
to web2py-us...@googlegroups.com
Pessoal,

Passei o dia tentando fazer isto abaixo funcionar.
Alguém poderia me ajudar, por favor?

Consegui criar as miniaturas das imagens usando a lib de Images do Google, mas não consigo modificar os campos da tabela com o blob destas miniaturas.
Quero fazer isso no instante em que a imagem é subida para o servidor, mas estou em dúvida...

Posso incluir variáveis no "request" para que elas sejam inseridas na base de dados ao chamar o form.accepts() ?
É normal inserir numa tabela, ao fazer um post, e logo depois de inserir, na mesma função, fazer buscas para fazer modificações no registro inserido?

É o que estou fazendo e funciona local no SDK do GAE, mas NÃO funciona no GAE remoto! Como?



# insere uma marca a partir do formulario
def criar():       
    form=SQLFORM(db.marcas)
    if request.vars:                

        #redimensiona a imagem e gera os logotipos nos tamanhos informados...
        imagens = validaImagemOriginal(request.vars.upl_logotipo,[50,100,200],request.vars.nome)                        

        # zera a imagem original do usuario para evitar que tente gravar e de erro pelo tamanho > 1MB
        request.vars.pop('upl_logotipo')
    
        # se de algum erro ao gerar ou redimensionar as imagens retorna... (tratar)
        if not 'original' in imagens: 
            return dict(form=form)
        else:
            pass
            #return dict(form=form)
        
        if form.accepts(request.vars):        
            
            # busca a marca que acabou de ser inserida
            marca = db(db.marcas.nome == request.post_vars['nome']).select().first()
            
            # atualiza a url_key (usado para achar a imagem pelo nome)

            marca.update_record(url_key=textoParaURL(request.post_vars['nome']))            
            
            # atualiza a imagem e os thumbs
            marca.update_record(img_logotipo=imagens['original'])
            marca.update_record(t_logotipo_50=imagens['t50'])
            marca.update_record(t_logotipo_100=imagens['t100'])
            marca.update_record(t_logotipo_200=imagens['t200'])
         
    return dict(form=form)   





Este é o modelo da tabela de marcas....



db.define_table('marcas', 
    Field('nome',
            unique=True, 
            label="Nome",
            required = True,            
            ),

    
    # serve para a entrada da imagem do logotipo, apenas.   
    Field('upl_logotipo', 'upload', 
          uploadfield='img_logotipo', 
          label="Logotipo",
          length = 1000*1024,
          required = True,
          ),
                
    # logotipo, efetivamente armazenado
    Field('img_logotipo', 'blob'),    
    
    # copias do logotipo, de vários tamanhos
    Field('t_logotipo_50', 'blob'),                
    Field('t_logotipo_100', 'blob'),                
    Field('t_logotipo_200', 'blob'),
                
    # armazena o valor que vem na URL para identificar a marca    
    Field('url_key', 
          readable=False, 
          writable=False,
          ),
    
)







--
--

Atenciosamente,
Alex BENFICA

--
"O que não se mede não se gerencia."




Bruno Rocha

unread,
Apr 20, 2012, 8:25:13 PM4/20/12
to web2py-us...@googlegroups.com
Eu faria isso com um computed field.

def REDIMENSIONATOR(image, size):
    # codigo que pega a imagem original e redimensiona
    return imagem_menor

db.marcas.t_logotipo_50.compute = lambda row: REDIMENSIONATOR(row.upl_logotipo, 50)


2012/4/20 Alex BENFICA <alexb...@gmail.com>
--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en



--

Alex Benfica

unread,
Apr 21, 2012, 11:12:15 AM4/21/12
to web2py-us...@googlegroups.com
Bruno,

Obrigado pela ajuda. Funcionou de primeira. Bem mais fácil do que imaginei.

Quando o validator é chamado, o valor já foi armazenado dentro do respectivo campo, certo?  tanto é que ele é passado como parâmetro...

Estou tendo problemas com imagens maiores que 1MB, que não podem ser armazenadas no datastore diretamente...

Eu recebo uma imagem de 3MB e quero processá-la assim antes de gravar no campo upl_logotipo, 
usando agora o REDIMENSIONATOR, cuja abordagem funcionou muito bem para os trhumbnails de imagens menores que 1MB.

Tenho como modificar o request antes de chamar 

if form.accepts(request.vars):

para evitar o erro de gravar uma imagem maior que o suportado pelo datastore?



Bruno Rocha

unread,
Apr 22, 2012, 11:05:05 AM4/22/12
to web2py-us...@googlegroups.com
Uma opção é forçar o redimensionamento do upl_logotipo logo no envio.

para isso pode criar um validador customizado


/models/qualquerarquivo.py
# <begin>
class MYVALIDATOR(object):
    def __init__(self, error_message="error", *args, **kwargs):
        self.error_message = error_message

    def __call__(self, value):
        # return (value, None) - value is valid
        # return (value, error_message) - value is invalid

value = funcao_que_redimensiona_imagem_para_menos_de_1MB(value) # coloque um try: except:

        return (value, None)

# </end>


db.marcas.upl_logotipo.requires = MYVALIDATOR()


2012/4/21 Alex Benfica <alexb...@gmail.com>

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
Reply all
Reply to author
Forward
0 new messages