Bueno, parece que en a descarga de ficheros tenía problemas con el IE7, así que tuvimos que reformarla, y aprovecho para contaros un poco la experiencia.
Lo primero, usar el resultado «stream» que nos proporciona struts… de manera que la configuración de la acción queda:
<action name=«download» class=«es.uva.aplicaciones.download.struts2.DownloadAdjunto»>
<result name=«success» type=«stream»>
<param name=«contentType»>application/msword</param>
<param name=«inputName»>inputStream</param>
<param name=«contentDisposition»>filename=»PLBValladolid.doc»</param>
<param name=«bufferSize»>1024</param>
</result>
<result name=«error»>/error.jsp</result>
</action>
La clase debe tener el método getInputStream o el correspondiente a la variable InputName que hemos puesto en el struts.xml. En el método execute es donde debemos cargar el fichero de la base de datos y asignarle al inputStream. En mi caso es coger un tipo blob de MySql a través de hibernate.
private InputStream inputStream=null;
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public String execute() {
HttpServletRequest request = (HttpServletRequest) ServletActionContext
.getRequest();
HttpServletResponse response = (HttpServletResponse) ServletActionContext
.getResponse();
if (request.getParameter(«id») != null) {
String id = request.getParameter(«id»);
file = dao.findAdjunto(id);
} else {
// ERROR: id no encontrado
addActionError(rb.getString(«errors.sinparametro»));
return ERROR;
}
if (file != null) {
response.setContentType(file.getTipo());
response.setContentLength(file.getSize().intValue());
response.setHeader(«Content-Disposition»,»inline; document.fileName=» + file.getNombre() + «»);
response.setHeader(«Cache-Control»,»must-revalidate, post-check=0, pre-check=0″);
response.setHeader(«Pragma», «public»);
response.setDateHeader(«Expires», 0);
Blob blob = file.getDatos();
try {
this.setInputStream(blob.getBinaryStream());
} catch (Exception e) {
System.err.println(e);
addActionError(rb.getString(«errors.escrituraencliente»));
return ERROR;
}
return SUCCESS;
} else {
//Fichero no encontrado
addActionError(rb.getString(«errors.ficheronoencontrado»));
return ERROR;
}
}