gravar imagem no servidor e depois exibir na tela
06/05/2013 14:10
0
bom dia galera,
Estou com uma dificuldade. Criei uma pasta no servidor onde trabalho, cuja máq utiliza o Linux, com todos os privilégios, afim de gravar e apagar caso necessário.
Ulitizei no Controller o comando:
def imagem = request.getFile("imagem")
imagem.transferTo(new File("/home/administrator/fotosUc/"+ucInstance?.id+'.jpg')) o qual está funcionando perfeitamente, e que também já havia testado na minha própria máq utilizando: imagem.transferTo(new File("C:/fotosUc/"+ucInstance?.id+'.jpg'))
E na página edit.jsp utilizei:
<img style="border:1px solid #ccc;" width="250px" src="${("/home/administrator/fotosUc/"+ucInstance?.id+'.jpg')}" />
como também:
<img style="border:1px solid #ccc;" width="250px" src="${new File("/home/administrator/fotosUc/"+ucInstance?.id+'.jpg')}" />
mas a imagem, embora pareça que foi encontrada, não é mostrada na tela, ou seja, ele mostra aquele x pequeno dentro de um quadradinho branco, e quando clico com o botão direito em propriedades, mostra o caminho correto do servidor com o nome da imagem:
http://200.255.195.10/home/administrator/fotosUc/17668.jpg
mas os parâmetro Tamanho, Tipo Criado em e Modificado, aparecem como Não disponível !!!
O que está faltando ? Ou o que estou fazendo de errado ??
Help me
Tags: request.getFile("imagem")


0
Mais um detalhe, gostaria de saber como fazer para apagar essa imagem no servidor ???
06/05/2013 14:24


0
Olá.

Celso, não pode passar como "src" de uma tag "img" um objeto do tipo "File". Nele deve constar uma URL (relativa ou absoluta).
Tente fazer assim:

<img style="border:1px solid #ccc;" width="250px" src='${new File("/home/administrator/fotosUc/"+ucInstance?.id+'.jpg').toURL()}' />


Note que apenas acrescentei o ".toURL()" ao final do teu objeto File. Também troquei as aspas duplas por simples no atributo "src".

Porém vale lembrar que se isso funcionar só vai mostrar a imagem quando acessar a aplicação localmente, pois se acessar de outro computador que não o próprio servidor a imagem não será encontrada. Ora, tudo porque o protocolo "file://" diz pro navegador encontrar imagens locais e não no servidor que está acessando. Isso é comportamento dos navegadores e não do Grails ;)


1
Eu sugiro que mude sua abordagem de RECUPERAÇÃO da imagem para exibi-la no GSP.

Poderia criar um método assim no controlador:

def download() {
def id = params.id
File f = // código para recuperar tua imagem como File, igual ao que você postou
response.contentType='image/jpeg' // não importa se é PNG, GIF, etc... isso funciona!
response.outputStream<<f.bytes
}


Dai, no teu GSP:


<img style="border:1px solid #ccc;" width="250px" src='download?id=${ucInstance?.id}' />


Espero que ajude.


0
Boa tarde Yoshi,
Obrigado pelas dicas, mas ainda não está funcionando.
Na primeira dica, onde acrescentou .toURL(), ja funcionava local, mesmo sem este parametro.
Quanto a segunda, meu projeto ficou assim:
Já tinha um metodo exibirimagem que fica dentro de ucController, o qual recuperava do bco, e quae ficou assim:
def exibirimagem = {
// Essa parte funciona buscando a imagem do bco
// byte[] img = ucInstance.imagem
// response.outputStream << img

// Tenta Recuperar imagem no servidor
def id = params.id
File f = new File("/home/administrator/fotosUc/"+id+".jpg")
response.contentType="image/jpeg"
response.outputStream<<f
}

e no edit.gsp tenho a seguinte chamada:
<img style="border:1px solid #ccc;" width="250px" src="${createLink(controller:'uc', action:'exibirimagem', id:ucInstance?.id)}" />

Mesmo assim, a imagem continua não aparecendo.
Obs: ao clicar com o botão direito na imagem e em propriedade aparece:
http://200.255.195.10/siem/uc/exibirimagem/17668

Pelo que entendi, está apontando para o servidor, dentro do projeto siem, no controller uc o método exibirimage com id 17668. Não consta a extensão .jsp !!! Está correto ? Lembrando que a imagem está em http://200.255.195.10/home/administrator/fotosUc/17668.jsp

Já havia feito um teste colocando a pasta fotosUc dentro do projeto em web-app e utilizando em edit.gsp a seguinte chamada:
<img style="border:1px solid #ccc;" width="250px" SRC="${resource(dir:'fotosUc',file:ucInstance?.id+'.jpg')}" />
e funcionou. Só que preciso que a pasta esteje fora do projeto para que quando fizer um deploy de nova versão, não tenha que salvar as fotos para depois do deploy recuperá-las.
Obrigado mais uma vez.
Mas se puder me ajudar ...
07/05/2013 17:01


0
Olá, Celso.

Amigo, eu acho que isso não funciona:
response.outputStream<<f


Acho que deveria ser
response.outputStream<<f.bytes


Abraços.



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