Download de arquivo com url externa

2 respostas
H

Olá, eu sei como colocar um link em minhas páginas para o usuário fazer download de um arquivo que esteja na minha máquina local.

Porém o documento que quero disponibilizar está disponível em outra máquina, com uma url externa (exemplo http://www.url.com.br/documento.pdf). Atualmente estou mandando um redirect (como abaixo) através do jsf para a página com o pdf, porém eu gostaria que ao invés de redirecionar o usuário para outra página, o browser já abrisse a opção de fazer download imediatamente.

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); ((HttpServletRequest) ec.getRequest()).logout(); ec.redirect("http://www.url.com.br/documento.pdf");

Alguém poderia me dar uma dica de como fazer isso?

Obs. Eu já tentei o http://www.primefaces.org/showcase/ui/fileDownload.jsf do primefaces, porém não consegui fazê-lo funcionar para pegar o arquivo de fontes externas.

2 Respostas

CLEYSON

Bom Dia, faço algo similar numa aplicação desktop ...

Tenho que conectar no web service da Google para recuperar um .xml ... segue trecho do código utilizado para conexão ... Você teria que ler o arquivo e reescreve-lo ... tem que ver se é viável ou não ...

URL oracle;

		try {

			oracle = new URL("http://maps.google.com/maps/api/geocode/xml?address="+cep+"+" + imovel + "+" 
					+ tipoLogradouro + "+" + logradouro + "+" + cidade +  "%20-%20PA,+BR&sensor=true");

		
		  //System.out.println(oracle);
		  URLConnection yc = oracle.openConnection();
	        BufferedReader in = new BufferedReader(
	                                new InputStreamReader(
	                                yc.getInputStream()));
	        
	        
	        String inputLine;
	        
	        //Le Buffer do XML Google
	        while ((inputLine = in.readLine()) != null) {,
			//...
		  }

No JSF eu crio um arquivo com ByteArrayOutputStream para download .... Tente agrupar o código desktop acima e a solução web abaixo ...

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext(); // Context  
                HttpSession session = (HttpSession) context.getSession(false);
                ByteArrayOutputStream outStream = new ByteArrayOutputStream();

               //...

                //Passando Parametros via Sessao
                session.setAttribute("arquivo", outStream);
                session.setAttribute("nomeFile", "arquivo.dxf");
                session.setAttribute("formato", "dxf");

               redirect("/DownloadServlet");


        protected void redirect(String page) {

        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();

        try {
            context.redirect(context.getRequestContextPath() + page);
        } catch (IOException ex) {
        }

       }

Minha Servlet ...

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.faces.bean.SessionScoped;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author cleyson
 */
@WebServlet(name = "DownloadServlet", urlPatterns = {"/DownloadServlet"})
@SessionScoped
public class DownloadServlet extends HttpServlet {                 
    private static ServletOutputStream outStream;

    /**
     * @return the outStream
     */
    public static ServletOutputStream getOutStream() {
        return outStream;
    }

    /**
     * @param aOutStream the outStream to set
     */
    public static void setOutStream(ServletOutputStream aOutStream) {
        outStream = aOutStream;
    }

    /**
     * @return the outStream
     */

    
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletOutputStream ouputStream = null;

        
        try{                         
            
                HttpSession session = request.getSession(true); 

                response.setContentType("application/octet-stream"); 
                response.addHeader("Content-Disposition", "attachment; filename=\"" + session.getAttribute("nomeFile") + "\";"); 
                response.setContentType((String) session.getAttribute("formato")); //Tipo do Arquivo 
                       
                                         
                //Recuperando os parâmetros enviados
                ByteArrayOutputStream file = (ByteArrayOutputStream)session.getAttribute("arquivo");

                byte bytes[] = null;
                
                bytes = file.toByteArray(); 
                response.setContentLength(bytes.length);                                
                ouputStream = response.getOutputStream();  
                ouputStream.write(bytes, 0, bytes.length);                            
                ouputStream.flush();

             
         }catch(Exception e){
             e.printStackTrace();         
         }finally {
            
            if (ouputStream != null)
                ouputStream.close();
            
         }
        
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

Tenta juntar todas essas idéias e tirar a sua solução/conclusão ...

H

Vlw CLEYSON, vou tentar fazer algo aqui baseado nas suas ideias.

Criado 4 de outubro de 2011
Ultima resposta 4 de out. de 2011
Respostas 2
Participantes 2