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