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 ...