Subindo um FileOutputStream na memoria e fazendo download

3 respostas
A

Bom dia,

gostaria de saber se tem alguma forma de criar um arquivo na memoria e na mesma hora fazer o download dele.

public HashMap relExcel() {  
      
           String sql = req.getParameter("pSql");  
    try{  
           DAOExcelSql dao = new DAOExcelSql();  
      
           List<String> NomeClunas = dao.consultaNmeColunas(sql);  
           List<Object> DadosColunas = dao.consultaDadosColunas(sql);  
           int linha = 1;  
           int count = 0;  
      
           StringBuilder sb = new StringBuilder();  
      
           HSSFWorkbook wb = new HSSFWorkbook();  
           HSSFSheet sheet = wb.createSheet("Relatório SQL");  
           HSSFRow Colunarow = sheet.createRow(0);  
           HSSFRow Linharow = sheet.createRow(linha);  
          
      
      
      
           for (int i = 0; i < NomeClunas.size(); i++) {  
            Colunarow.createCell(i).setCellValue(NomeClunas.get(i));  
        }  
      
      
            for (int i = 0; i < DadosColunas.size(); i++) {  
      
                if(count == NomeClunas.size()){  
                    linha++;  
                    Linharow.setRowNum(linha);  
                    count = 0;  
                }  
               Linharow.createCell(count).setCellValue(String.valueOf(DadosColunas.get(i)));  
      
               count ++;  
           }  
      
             
         FileOutputStream stram = new FileOutputStream("relSQL.xls");  
         wb.write(stram);  
      
      
      
            }catch (Exception ex){  
                ex.printStackTrace();  
            }  
        return dados;  
    }

esse relSQL que eu quero fazer download

3 Respostas

T

Seu código está confuso, tente dividir a função que cria o arquivo e a função de download em metodos diferentes.

Quanto à criar um arquivo eu não sei, mas o download podes encontrar algumas dicas neste topico

Basicamente você deve escrever a inputStream do seu arquivo na outputStream da response e recarregar o formulario

W

eu já tinha respondido isto em outro tópico, algum moderador deve ter deletado por ser post duplo :?:

http://guj.com.br/java/238706-subindo-um-fileoutputstream-na-memoria-e-fazendo-download

M

Amigo o pessoal adora fazer um rodeio enorme para responder uma pergunta, isso quando respondem.
Muitas vezes não dão uma resposta precisa e além de enrolar ainda te encaminham para links e links, ou livros.
Essas pessoas muitas vezes estão no seu lugar e procuram por respostas descentes.
Se queremos um ambiente mais colaborativo então temos que colaborar.
Por que dar respostas enigmáticas se por vezes somos nós quem estamos procurando por respostas precisas?

Enfim, a solução para seu problema é a seguinte:

  • Ao invés de:
FileOutputStream stram = new FileOutputStream("relSQL.xls");    
     wb.write(stram);
  • Faça isso:
// Cria o arquivo
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     wb.write(baos);
     baos.close();

     // Disponibiliza o download para o browser do cliente
     HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
     response.setContentType("application/xls");
     response.setHeader("Content-disposition","attachment;filename=" + "NomeDoSeuArquivo.xls");
     response.getOutputStream().write(baos.toByteArray());
     FacesContext.getCurrentInstance().responseComplete();

Faça os testes!

  • Obs.: Separei o NomeDoSeuArquivo.xls para facilitar a compreensão.
Criado 12 de abril de 2011
Ultima resposta 3 de abr. de 2012
Respostas 3
Participantes 4