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.