2010-01-22 24 views
8

Esto puede sonar totalmente estúpido, pero es un caso de la vida real :(¿Cómo se sirve un archivo con JSP? .

soy capaz de mostrar una tabla HTML con un nombre de enlace "virtual"

Algo como esto:

Xyz description <a href="docId=123">document.doc</a> 

Xyz description <a href="docId=456">documentB.doc</a> 

Xyz description <a href="docId=798">documentC.doc</a> 

Este id doc representa un id en la base de datos (por estos documentos se almacenan en un blob como byte [])

todos modos. soy capaz de conseguir esa identificación, consultar la base de datos y recuperar el byte [] (e incluso almacenarlo en un archivo tmp)

Lo que no puedo entender es que cuando el usuario hace clic en el enlace (y luego de realizar la recuperación de la base de datos) "sirve" el byte [] al usuario.

Ahora la peor parte, y lo que me hace hacer esta pregunta aquí, es que necesito hacer esto solo con JSP (sin servlet) y sin bibliotecas de terceros (solo ... no me pregunten por qué odio también)

So. ¿Cómo sirvo en un jsp el contenido binario de una matriz de bytes almacenados en el sistema de archivos del servidor

Mi primer invitado es:

<% 
InputStream read // read the file form the fle system 
response.getOutputStream().write(theBytesReader); 
%> 

Estoy cerca a la solución?

¿Funcionaría esto con el cliente como si realmente hubiera hecho clic en el servidor para obtener un archivo real?

Gracias de antemano.

Respuesta

5

Hasta el punto, simplemente escriba el mismo código en JSP como lo haría en un Servlet class. Prácticamente puedes copiarla. Solo asegúrese de que sea y no escribiendo cualquier texto de plantilla en la transmisión, esto incluye saltos de línea y espacios en blanco fuera de los scriptlets. De lo contrario, se escribiría en el archivo binario y lo corrompería.

Si tiene varios bloques de scriptlet, debe organizarlos de modo que no haya ningún salto de línea entre el final %> de un scriptlet y el <% de inicio del scriptlet siguiente. Por lo tanto, p.

<%@page import="java.io.InputStream" %><% 
    //... 
%> 

en lugar de

<%@page import="java.io.InputStream" %> 
<% 
    //... 
%> 
+0

Coloque el código en el archivo JSP como lo indica BalusC, pero use 'out.clear();' para borrar el resultado, en lugar de estropear el formateo de la página. –

1

Algo como esto ...

InputStream instr = null; 
try { 
    instr = new BufferedInputStream(new FileInputStream("file.txt")); 
    for(int x=instr.read(); x!=-1; x=instr.read()){ 
     out.write(x); 
    } 
} finally { 
    out.close(); 
    if(instr != null) instr.close(); 
} 

Usted necesitará esta como la respuesta al clic (ya sea en una recarga de la página o en otro archivo JSP).

Hay mejores soluciones de almacenamiento en búfer que puede hacer con la escritura utilizando matrices de bytes en lugar de una a la vez ... Lo dejo por usted.

Lo siento, estás atrapado en JSP scriptlet land ... Espero que esto ayude.

+0

Es necesario establecer el tipo MIME en la respuesta, así como en mi ejemplo. –

+0

Es cierto ... estaba asumiendo esa parte, gracias por aclarar sin embargo. – cjstehno

2

Debe establecer el tipo MIME en la respuesta HTTP, como se muestra a continuación, además del código de muestra que ha proporcionado.

response.setContentType("application/octet-stream"); 

Nota, la aplicación/octet-stream tipo MIME se utiliza para indicar un archivo binario.

+0

Sí, ya lo tengo, realmente estoy usando como: 'application/vnd.ms-excel' pero mi verdadera pregunta es, ¿funcionaría este método? (¿leer y escribir usando response.out?) – OscarRyz

+0

Sí, debe ser siempre que el tipo MIME sea correcto. –

+0

En realidad, la gente hace esto con bastante frecuencia para mostrar imágenes dinámicas en las que tiene una URL de imagen que es algo así como /foo/bar/yourImage.jsp y sirve la imagen dinámicamente al devolver los bytes de la imagen y al configurar imagen/gif o similar al tipo de contenido. –

2

Por favor, por favor, por favor no hacer esto.

Estás haciendo un flaco favor a tus usuarios.

HTTP es increíblemente rico en términos de lo que puede hacer con los archivos. Almacenamiento en caché, fragmentación, acceso aleatorio, etc.

Eche un vistazo a algo como FileServlet, y martilleo para que quepa. Sí, es un servlet, en lugar de un JSP, pero esto es lo que desea hacer para ser un buen ciudadano HTTP.

Algunos contenedores tienen otras opciones que puede utilizar, se puede hackear Tomcat DefaultServlet, etc.

+0

Esto no es una respuesta a mi pregunta, pero un comentario, soy consciente de que esto podría lograrse con los servlets, pero si lee mi pregunta, esta no es una opción :(Lo siento pero su respuesta no es útil – OscarRyz

+0

A JSP es un servlet, puedes prácticamente insertar el 99% del código en tu JSP y obtener la misma cosa. –

Cuestiones relacionadas