Descargar un fichero de una BD con Struts2

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;
}
}

Problemas al autenticar un usuario en Samba con Vista

He estado un par de horas dandole vueltas a un fallo que tenía, y es que desde XP me conectaba a un alojamiento samba sin problemas pero desde Vista no… mucho investigar hasta descubrir la solución.

El error que me dejaba en los logs del samba era «libsmb/ntlm_check.c:smb_pwd_check_ntlmv1(55)  smb_pwd_check_ntlmv1: incorrect password length (70)»

Resulta que en Vista está configurado para utilizar sólo NTLM versión 2 (NTLMv2) cuando los equipos cliente utilizan autenticación de desafío y respuesta para autenticar a los servidores de autenticación. Este comportamiento predeterminado puede provocar problemas cuando Windows autentica con Samba….

La solución, se supone que ejecutando «secpol.msc» pero si como en mi caso no lo tienes, debes hacer lo siguiente:

  1. Haga clic en inicio , haga clic en Ejecutar , escriba regedit en el cuadro Abrir y, a continuación, haga clic en ACEPTAR .
  2. Busque y haga clic en la siguiente subclave:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA
  3. En el panel de detalles, haga doble clic en LMCompatibilityLevel .
  4. En el cuadro de datos de valor , escriba el valor adecuado para su escenario y, a continuación, haga clic en ACEPTAR .

¿Qué valor poner? Veamos las posibilidades:

Valor Descripción Las notas
0 Enviar respuestas de LAN Manager (LM) y respuestas de NTLM. Los equipos cliente envían respuestas de LM y NTLM respuestas. Equipos cliente no utilizan nunca la seguridad de sesión de NTLMv2. Los controladores de dominio aceptan autenticación LM, la autenticación NTLM y la autenticación NTLMv2.
1 Enviar la autenticación de LAN Manager y la autenticación de NTLM y utilizar la seguridad de sesión de NTLMv2 si se negocia. Los equipos cliente utilizan la autenticación de LAN Manager y la autenticación de NTLM. Los equipos cliente utilizan la seguridad de sesión de NTLMv2 si el servidor admite la seguridad de sesión de NTLMv2. Los controladores de dominio aceptan autenticación LM, la autenticación NTLM y la autenticación NTLMv2.
2 Enviar respuestas de NTLM sólo. Los equipos cliente utilizan sólo la autenticación NTLM. Los equipos cliente utilizan la seguridad de sesión de NTLMv2 si el servidor admite la seguridad de sesión de NTLMv2. Los controladores de dominio aceptan autenticación LM, la autenticación NTLM y la autenticación NTLMv2.
3 Enviar únicamente respuestas NTLMv2. Los equipos cliente utilizan sólo la autenticación NTLMv2. Los equipos cliente utilizan la seguridad de sesión de NTLMv2 si el servidor admite la seguridad de sesión de NTLMv2. Los controladores de dominio aceptan autenticación LM, la autenticación NTLM y la autenticación NTLMv2.
4 Enviar respuestas de NTLM sólo y rechaza la autenticación LM. Los equipos cliente utilizan sólo la autenticación NTLM. Los equipos cliente utilizan la seguridad de sesión de NTLMv2 si el servidor admite la seguridad de sesión de NTLMv2. Los controladores de dominio rechaza la autenticación LM. Los controladores de dominio aceptan la autenticación NTLM y la autenticación NTLMv2.
5 Enviar únicamente respuestas NTLMv2 y rechace la autenticación de LAN Manager y la autenticación de NTLM. Los equipos cliente utilizan sólo la autenticación NTLMv2. Los equipos cliente utilizan la seguridad de sesión de NTLMv2 si el servidor admite la seguridad de sesión de NTLMv2. Los controladores de dominio rechaza la autenticación de LAN Manager y la autenticación de NTLM. Los controladores de dominio aceptan sólo la autenticación NTLMv2.

 

Y la respuesta correcta es el 1. Con esto funciona sin problemas. Espero que os sirva de ayuda.