Problemas com Arquivo de Download

4 respostas
J

Boa tarde!

Estou com problemas para gerar esse Arquivo de Download…

String path = "c:\\Projetos\\download\\";  
	String filename = "B0010907.081";
	String fullFileName = path + filename;    
	File file = new File(fullFileName);    
	

	byte[] buf = new byte[(int)file.length()];    
	
	
	try {

		HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
		String encodeUrl = response.encodeURL (fullFileName);
		response.setContentType("application/text;");
		response.addHeader("Content-Disposition","attachment;filename=\"" + filename + "\""+ encodeUrl);
		response.setContentLength(buf.length);
		OutputStream writer = response.getOutputStream();

		writer.write(buf);
			
		writer.flush();
		writer.close();
		
		System.out.println(response.getCharacterEncoding()) ;
		
		FacesContext.getCurrentInstance().responseComplete();			

	} catch (Exception e) {
		facesMessages.add("There is nothing to export with the selected dates");
	} 

}

Anteriormente realizei um Upload para fazer uma simulação de envio desse arquivo, onde esse arquivo é enviado e eu recebo, “trato” esse arquivo para finalmente deixar ele disponível para fazer o Download…
Só que quando esse download é realizado não aparece nada nesse arquivo mesmo ele tendo espaço.

4 Respostas

J

Na pesquisa que fiz antes de postar aqui encontrei esse, http://www.guj.com.br/posts/list/135677.java, mas isso não me ajuda

newbcc

Olá Júlia,

eu tive esse mesmo problema que você. Como solução eu criei um Servlet, e redirecionei a minha request para ele, e assim este ficava responsável por exibir o stream no cliente. No caso, geração de um arquivo MS Excel.

Tenta criar a lógica de exportação no servlet, e na sua aplicação você chama ele.

Abs.

J

Infelizmente com o Servlet não consegui, fiz o teste e o arquivo ainda aparece em branco…
e com o PrintWriter esta gerando erro no write

PrintWriter writer = response.getWriter();

writer.write(buf);
			
		writer.flush();
		writer.close();
		
		System.out.println(response.getCharacterEncoding()) ;
		
		FacesContext.getCurrentInstance().responseComplete();			

	} catch (Exception e) {
		facesMessages.add("There is nothing to export with the selected dates");
	}
newbcc

Oi Júlia,

então, o quê eu fiz foi criar o arquivo no servlet.

No meu Manager Bean eu simplesmente fiz o redirecionamento para o meu Servlet. Da seguinte maneira:

e dentro do Servlet a criação do meu arquivo Excel:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		String dt = new SimpleDateFormat("dd_MM_yyyy__HH_mm_ss").format(new Date());
		String fileName = "Relatório_Status_" + dt + ".xls";
		try {
			response.setContentType("application/vnd.ms-excel");
			response.setCharacterEncoding("ISO-8859-1");
			response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
                        
                        /**
                         * Criar o arquivo Excel
                         */
			this.createExcelFile(request, response);
		} 
		catch (Exception e) {
			throw new ServletException("Erro ao exportar arquivo excel!", e);
		} 	
	}

E ao invés de usar um PrintWriter para escrever na saída, eu uso OutputStream:

private void createExcelFile(HttpServletRequest request, HttpServletResponse response) throws IOException, WriteException {
		WorkbookSettings ws = new WorkbookSettings();  
		ws.setLocale(new Locale("en", "EN"));
		WritableWorkbook workbook = Workbook.createWorkbook(response.getOutputStream());
		WritableSheet s = workbook.createSheet("Status_Funcionários", 0);
                
                /**
                 * Criar as células dentro do arquivo Excel
                 */
		writeDataSheet(s, request);
		workbook.write();  
		workbook.close();  
	}

Bom, veja se com essas novas idéias você consegue alguma solução. :slight_smile:

Abs.

Criado 18 de agosto de 2010
Ultima resposta 19 de ago. de 2010
Respostas 4
Participantes 2