Download de Arquivo com Struts

Alguém já precisou fazer download de arquivos usando Struts?

Preciso clicar em um link e proceder com o download de um arquivo. Eu leio o arquivo do FileSystem e pego os bytes, pare enviar via response.

Porém queria saber qual a melhor abordagem. Eu escrever os bytes pelo meu próprio Action ou dar forward para um Servlet escrever os dados?

Valeu

Já tive um problema semelhante, e tive de usar um servlet.
É que o problema é o seguinte: embora pela definição você até pudesse usar um JSP para enviar dados binários (usando response.getOutputStream()), na prática isso não funciona direito (principalmente quando você usa certos produtos como o iPlanet Application Server, um produto da Sun, que foi substituído pelo Sun Java System Application Server). No caso do iPlanet eu recebia uma exceção quando ia pegar response.getOutputStream (isso não ocorria no Tomcat + JBoss).
Se por exemplo você tem de escrever código que funcione em pelo menos duas plataformas diferentes, é mais confiável usar um servlet.

Em um projeto anterior, que não usa Struts, eu uso o JSP para gravar os bytes no cliente, numa boa. Usamos o JBoss/Tomcat aqui.

Agora, no projeto atual eu to usando Struts. Acabei mandando meu Action gravar os bytes via o OutputStream e depois dou um flush e, por fim, dou um “return null;”, ou seja, o Struts não redireciona para nenhuma página posteriormente. Funfa na boa!

daniel, tem como postar o codigo q vc usou aki??

preciso fazer a mesma coisa, mas antes tenho q gravar o arquivo .txt

valew

[code]import javax.servlet.http.;
import org.apache.struts.action.
;

/**

  • Processa o Download do Arquivo.
    */
    public class DownloadAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest req, HttpServletResponse res) throws Exception {
    DownloadForm dform = (DownloadForm) form;
    DownloadArquivoDelegate dad = new DownloadArquivoDelegate();
    ArquivoGerado arquivo = null;
    try {
    arquivo = dad.fazerDownload( param1, param2 );

         res.setContentType("application/octet-stream");
         res.setHeader("Content-Disposition", "attachment; filename="+arquivo.getNome());
         res.getOutputStream().write( arquivo.getDados() );
         res.getOutputStream().flush();
     } catch( GPAException e ) {
         ActionErrors erros = new ActionErrors();
         erros.add( ActionErrors.GLOBAL_ERROR, new ActionError("erro.mensagem", e.getMessage()) );
         super.saveErrors( req, erros );
         return mapping.findForward("erroDownload");
     }
     
     //retorna NULL pois não deve ir para nenhuma página depois.
     return null;
    

    }
    }[/code]

mais uma coisinha…
p/ escrever no response preciso de um array de bytes do arquivo, certo??

como faco mesmo p/ me retornar esse array??

valew

InputStream is = new FileInputStream( "c:\\arquivo.txt" ); byte[] dados = new byte[1024]; int readBytes = -1; while( (readBytes = is.read( dados, 0, 1024 )) > 0 ) { os.write( dados, 0, readBytes ); } os.flush(); os.close(); is.close();

thanks destro…funfou perfect…

Olha que engraçado. No momento em que ví esta sua mensagem, o meu número de posts era 2220 e o seu era 1110.

danieldestro

queria saber como você fez o mapeamento do action no struts.

obrigado

Olá Daniel

Sei que já faz um tempo mais se tivesse como teria como postar o mapeamento do aciton no struts que você fez ?

Desde já agradeço

Obrigado.

Tem como saber quando o download termina?