Neste post, vou mostrar com disponibilizar um arquivo para download com Grails, e como disponibilizar a visualização de uma imagem qualquer fora dos recursos do projeto.
//Model class Arquivo{ String file } //Controller def show(){ def item = Arquivo.get(params.id) def arquivo = grailsAttributes.getApplicationContext().getResource("/images/image-not-found.png").getFile().toString() if(item != null){ def base = '/var/www/htdocs/imagens' def file = new File(base, item.file) if(file.exists()){ arquivo = file.getAbsolutePath() } } response.outputStream << readImage(arquivo) } def download(){ def item = Arquivo.get(params.id) if(item != null){ def base = '/var/www/htdocs/arquivos' def file = new File(base, item.file) if(file.exists()){ file.getAbsolutePath() response.setContentType("application/octet-stream") response.setHeader("Content-disposition", "attachment;filename=${file.getName()}") response.outputStream << file.newInputStream() return } } render view: 'link-quebrado' } public byte[] readImage(String file) { byte[] buffer = new byte[1024]; InputStream is = new FileInputStream(file); ByteArrayOutputStream out = new ByteArrayOutputStream(); while (is.read(buffer) != -1) { out.write(buffer); } return out.toByteArray(); }
Agora vamos a explicação.
Primeiramente criamos a classe Arquivo, que será reponsável por identificar o arquivo solicitado. Nessa caso, recebemos o arquivo via upload, e disponibilizamos ele para download ou como visualização de imagem.
Disponibilizando uma imagem:
A Closure show é usada para visualização de uma imagem. Nela recuperamos a imagem solicitada, através do id do arquivo. Armazenamos a imagem em um array de bytes, e jogamos ela pra dentro do outputStream. O link será algo mais ou menos assim. Caso a imagem não exista, é disponibilizada uma imagem padrão.
Simples?! Isso é Grails!
Disponibilizando um arquivo para download:
A Closure download é usada para fazer o download do arquivo solicitado. Nela recuperamos o arquivo solicitado, lemos seu conteúdo e adicionamos no outputStream. Caso o arquivo não exista, é renderizado uma pagina padrão de link quebrado.
Simples?! Isso é Grails!
E com isso, concluímos os ensinamentos =D
Até a próxima!