sexta-feira, 24 de agosto de 2012

Download de Arquivos com Grails

Fala galera!

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!

Nenhum comentário:

Postar um comentário