Thread + imagem
17/03/2014 13:28
0
Bom dia galera.

Estou com o seguinte problema e não encontro uma solução.
Tenho varias imagens no meu banco de dados armazenados em byte[]. Meu controlador pega essa imagem, coloca uma marca dagua nela e devolve pra pagina.

Porem quando eu tenho mais de 3 usuario no sistema acessando a mesma imagem, o servidor demora muito pra construir a imagem com a marca dagua, e muitas vezes nem devolve nada prara pagina.

Então pensei em abrir uma thread para cada solicitação de imagem, porem não esta dando certo. Quando a pagina faz a requisição, a imagem não é construida na pagina e a mesma recebe erro 404.

Alguem poderia me dar uma ajuda quanto a este meu problema de mais de um usuario estar solicitando a mesma imagem no mesmo tempo do servidor?

Esse é minha gsp:

<img id="imagem" class="imagem${i}" src='${createLink( controller: 'centrais', action: 'viewImgEsquema', id:img.imagem.id ) }'/>

Esse é minha action no controlador:

def viewImg() {
def imagemInstance = Imagem.get(params.id)

if(imagemInstance) {
runAsync {
println "thread"
byte[] img = imagemInstance.img
response.contentType = "image/jpeg"
response.contentLength = img.length
OutputStream out = response.getOutputStream()
out.write(img)
out.close()
println "fim da thread"
}
} else {
response.sendError(404)
}
}
Tags: imagem, thread, response, marca dagua, getOutputStream


0
Cara, eu acredito que seria melhor colocar a marca de água quando o usuário efetua o upload da imagem. Dessa forma teríamos apenas uma vez esse processamento de inclusão de marca de aguá.

E a parte se exibição apenas pegaria a imagem do banco de retornaria para o usuário.

Também teria que ver o tipo de imagem, jpg, png etc. Se você não estiver restringindo o tipo de imagem acho que seria interessante analisar essa possibilidade, comigo já aconteceu do usuário querer efetuar o upload de um "bmp" de 5 mb. hehe

Abraço.
17/03/2014 16:54


0
Boa tarde Leandro.

Cara não tem como colocar a marca d'água na hora de carregar a imagem, pois cada usuário que for cadastrado no sistema tem um token de identificação e a mesma imagem pode ser visualizada por mais de um usuário, então a criação da marca d'água tem que ser dinâmica mesmo.

Uma forma que estou ainda estudando era gerar a imagem da marca d'água quando o usuário entrar no sistema e salvar ela em disco, e depois quando for pra apresentar uma imagem pro usuário eu só junto a marca d'água que salvei em disco com a imagem original, certamente esse processo vai consumir bem menos processamento do que a forma atual.
17/03/2014 17:21


0
É uma opção.

Dependendo da quantidade de usuários e o tamanho da imagem você pode até pensar em colocar na sessão do usuário em vez de gravar no disco.
18/03/2014 15:07


0
quando trabalhei com imagens e fazia backup no BD, eu guardava o cache dessa imagem na pasta /tmp do linux

se o arquivo existisse la, usava ele, senao puxava do BD

as vezes é o caso de guardar a imagem já com a marca d'agua em uma pasta

essa solucao é possivel?
21/03/2014 17:19



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto