JFileChooser + WEB

3 respostas
L

Boa tarde galera. Estou com um problema aqui que está me tirando o sono.
Já revirei o forum e o google atras de informações mas não estou conseguindo resolver.

Vamos lá.. vou tentar resumir o problema:

Tenho uma aplicação web em que o usuário vai fazer o download de um relatório em formato csv e xml. Até ai, sussa.
O problema é quando eu tento fazer esse donwload de qualquer estação que não seja o servidor.

No servidor, abre normalmente o ambiente para selecionar diretorios do JFileChooser.
Mas gostaria que salvasse na máquina do usuário que está fazendo a pesquisa, e não no servidor.

Entenderam?

A aplicação está no 192.168.1.1 e quando acesso pelo 192.168.1.10 e tento fazer o download pelo JFileChooser, ele abre o box do "salvar como" no 192.168.1.1;

Andei pesquisando sobre JNLP mas não é bem isso que eu preciso, encontrei esse link (http://www.coderanch.com/t/252452/Applets/java/JFileChooser-applet) com algo que parece a solução, mas não consigo fazer funcionar no meu caso.

Agradeço qualquer ajuda

segue codigo

JFileChooser escolha = null;
		String formatoExtensao = null;
			
                Iterator<?> it2 = lista.iterator();
		for (; it2.hasNext();)
		{
			// Caso seja XML
			usuarioXML = new Usuario();
			usuarioXML = (Usuario) it2.next();
			dados += xstream.toXML(usuarioXML);
		}
		escolha = new JFileChooser();
		escolha.setFileFilter(new xmlFilter());
		formatoExtensao = ".xml";
		// Salvando arquivos
		try
		{
			escolha.setDialogTitle("Salvar arquivos para cobrança");
			escolha.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
			int valor = escolha.showSaveDialog(null);
			
			if (valor == JFileChooser.APPROVE_OPTION)
			{
				File salvar = escolha.getSelectedFile().getAbsoluteFile();
				FileWriter fw = new FileWriter(salvar + formatoExtensao);
				fw.write(dados);
				fw.flush();
				fw.close();
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

Filtro XML

public class xmlFilter extends FileFilter
{
	private final static String xml = "xml";
	
	/** construtor vazio da classe */
	public xmlFilter()
	{
	}
	
	public boolean accept(File f)
	{
		if (f.isDirectory())
		{
			return true;
		}
		
		String extension = getExtension(f);
		if (extension != null)
		{
			if (extension.equals(xml))
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		
		return false;
	}
	
	// a desc. dos tipos de arquivos que irão aparecer no jfilechooser
	public String getDescription()
	{
		return "*.xml";
	}
	
	public static String getExtension(File f)
	{
		String ext = null;
		String s = f.getName();
		int i = s.lastIndexOf('.');
		
		if (i > 0 && i < s.length() - 1)
		{
			ext = s.substring(i + 1).toLowerCase();
		}
		return ext;
	}
}

3 Respostas

E

Se você está escrevendo uma aplicação Web que chama alguma coisa escrita em Swing (como o javax.swing.JFileChooser), alguma coisa está errada com certeza.

Você está confundindo os conceitos de aplicação Web e Desktop de forma bastante ingênua.

kicolobo

Oi leandropietrosantos,

no caso, a classe JFileChooser só pode ser usada em aplicações desktop. Realmente, do lado servidor, quando for executar, a janelinha irá aparecer, porque a aplicação “pensa” ser desktop.
No entanto, do lado cliente o JFileChooser não vai aparecer porque o browser pensa que se trata de uma aplicação web.

É importante mencionar que sua aplicação web não pode definir aonde o arquivo será salvo na máquina do usuário. Ela só envia os dados para o cliente. Nesta situação, uma solução interessante é disponibilizar o arquivo como um link ou como resposta para o cliente, de tal modo que este se vire com aonde o arquivo deva ser salvo.

L

Galera consegui resolver, não com JFileChooser, (realmente nunca conseguiria), e sim com Jquery;

Pra quem quer mais detalhes:

o código é esse

Código java

response.setContentType("application/force-download");
		response.setHeader("Content-Transfer-Encoding", "binary");
		response.setHeader("Content-Disposition", "attachment;filename=arquivo.xml");

		String conteudoArquivo = LISTA_A_SER_USADA
		StringBuffer sb = new StringBuffer(conteudoArquivo);
		InputStream in = new ByteArrayInputStream(sb.toString().getBytes("UTF-8"));
		 
	    OutputStream out = response.getOutputStream();  
	  
	    int buflen = 1024;  
	    byte[] buffer = new byte[buflen];
	  
	    int read;  
	    int length = 0;  
	  
	    while ((read = in.read(buffer, 0, buflen)) > 0) {  
	        length += read;  
	        out.write(buffer, 0, read);  
	    }  
	  
	    response.setContentLength(length);  
	  
	    out.flush();  
	    out.close();  
	  
	    in.close();

Código javascript

<script type="text/javascript" src="script/jquery-1.8.2.js"></script>
<script type="text/javascript" src="script/jquery.fileDownload.js"></script>

<script>
$.fileDownload('classe_exportacao.do?acao=downloadArquivo&id=' + id,
					{
						successCallback: function (url) {			        
						},
						failCallback: function (html, url) {				 
							alert('Erro ao exportar o arquivo');
						}
					});

</script>
Criado 7 de janeiro de 2013
Ultima resposta 9 de jan. de 2013
Respostas 3
Participantes 3