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.
danieldestro
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!
R
rbarioni
daniel, tem como postar o codigo q vc usou aki??
preciso fazer a mesma coisa, mas antes tenho q gravar o arquivo .txt
valew
danieldestro
importjavax.servlet.http.*;importorg.apache.struts.action.*;/** * Processa o Download do Arquivo. */publicclassDownloadActionextendsAction{publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestreq,HttpServletResponseres)throwsException{DownloadFormdform=(DownloadForm)form;DownloadArquivoDelegatedad=newDownloadArquivoDelegate();ArquivoGeradoarquivo=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(GPAExceptione){ActionErrorserros=newActionErrors();erros.add(ActionErrors.GLOBAL_ERROR,newActionError("erro.mensagem",e.getMessage()));super.saveErrors(req,erros);returnmapping.findForward("erroDownload");}//retorna NULL pois não deve ir para nenhuma página depois.returnnull;}}
R
rbarioni
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
danieldestro
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();
R
rbarioni
thanks destro…funfou perfect…
danieldestro
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.
R
rossileonardo
danieldestro
queria saber como você fez o mapeamento do action no struts.
obrigado
YuriSilva
Olá Daniel
Sei que já faz um tempo mais se tivesse como teria como postar o mapeamento do aciton no struts que você fez ?