He visto algunas sugerencias, como que el directorio de imágenes sea un enlace simbólico que apunta a un directorio fuera del contenedor web, pero ¿funcionará este enfoque en entornos Windows y * nix?
Si cumple las reglas de ruta del sistema de archivos * nix (es decir, utiliza barras inclinadas exclusivamente como en /path/to/files
), funcionará también en Windows sin la necesidad de jugar con feos File.separator
concatenaciones de cadenas. Sin embargo, solo se escanearía en el mismo disco de trabajo desde el que se invoca este comando. Entonces, si Tomcat está instalado, por ejemplo, C:
entonces /path/to/files
realmente apuntaría a C:\path\to\files
.
Si todos los archivos se encuentran fuera de la aplicación web y desea tener Tomcat DefaultServlet
para manejarlos, entonces todo lo que necesita hacer básicamente en Tomcat es agregar el siguiente elemento de Contexto a la etiqueta /conf/server.xml
interna <Host>
:
<Context docBase="/path/to/files" path="/files" />
De esta manera serán accesibles a través de http://example.com/files/...
. El ejemplo de configuración de GlassFish / Payara se puede encontrar aquí y el ejemplo de configuración de WildFly se puede encontrar aquí .
Si desea tener control sobre la lectura / escritura de archivos usted mismo, debe crear un archivo Servlet
para esto, que básicamente solo obtiene una InputStream
muestra del archivo, por ejemplo, FileInputStream
y lo escribe en OutputStream
el HttpServletResponse
.
En la respuesta, debe establecer el Content-Type
encabezado para que el cliente sepa qué aplicación asociar con el archivo proporcionado. Y, debe configurar el Content-Length
encabezado para que el cliente pueda calcular el progreso de la descarga, de lo contrario será desconocido. Y debe establecer el Content-Disposition
encabezado en attachment
si desea un cuadro de diálogo Guardar como , de lo contrario, el cliente intentará mostrarlo en línea. Finalmente, solo escriba el contenido del archivo en la secuencia de salida de respuesta.
Aquí hay un ejemplo básico de tal servlet:
@WebServlet("/files/*")
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String filename = URLDecoder.decode(request.getPathInfo().substring(1), "UTF-8");
File file = new File("/path/to/files", filename);
response.setHeader("Content-Type", getServletContext().getMimeType(filename));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
Files.copy(file.toPath(), response.getOutputStream());
}
}
Cuando se asigna en un url-pattern
de, por ejemplo /files/*
, puede llamarlo por http://example.com/files/image.png
. De esta manera, puede tener más control sobre las solicitudes que las que DefaultServlet
tiene, como proporcionar una imagen predeterminada (es decir, más if (!file.exists()) file = new File("/path/to/files", "404.gif")
o menos). También request.getPathInfo()
se prefiere usar el anterior request.getParameter()
porque es más compatible con SEO y, de lo contrario, IE no elegirá el nombre de archivo correcto durante Guardar como .
Puede reutilizar la misma lógica para servir archivos desde la base de datos. Simplemente reemplace new FileInputStream()
por ResultSet#getInputStream()
.
Espero que esto ayude.
Ver también:
<Context docBase="/path/to/images" path="/images" />
en Windows, pero obteniendo la ruta relativa a la carpeta webapps:C:\install\apache-tomcat-8.0.26\webapps\tmp] is not valid
<Context docBase="C:\tmp\" path="/images" />
HTTP Status 404 - /images/
al hacer:http://localhost:8080/images/
PERO un archivo específico de debajo de lastmp
obras:http://localhost:8080/images/Tulips.jpg
está bienPuede hacerlo colocando sus imágenes en una ruta fija (por ejemplo: / var / images o c: \ images), agregue una configuración en la configuración de su aplicación (representada en mi ejemplo por la clase Settings.class) y cárguelas así, en uno
HttpServlet
de los tuyos:O si quieres manipular la imagen:
entonces el código html sería
<img src="imageServlet?imageName=myimage.png" />
Por supuesto, debe pensar en servir diferentes tipos de contenido: "image / jpeg", por ejemplo, según la extensión del archivo. También debe proporcionar un poco de almacenamiento en caché.
Además, podría usar este servlet para reescalar la calidad de sus imágenes, proporcionando parámetros de ancho y alto como argumentos, y usando
image.getScaledInstance(w, h, Image.SCALE_SMOOTH
), considerando el rendimiento, por supuesto.fuente
Añadir a server.xml:
Habilite el parámetro de listado de archivos dir en web.xml:
fuente
Requisito: Acceso a los recursos estáticos (imágenes / videos, etc.) desde fuera del directorio WEBROOT o desde el disco local
Paso 1:
cree una carpeta en webapps del servidor tomcat. Digamos que el nombre de la carpeta es myproj
Paso 2:
En myproj, cree una carpeta WEB-INF debajo de esto, cree un simple web.xml
código bajo web.xml
Estructura de directorios para los dos pasos anteriores
Paso 3:
ahora cree un archivo xml con el nombre myproj.xml en la siguiente ubicación
CÓDIGO en myproj.xml:
Paso 4:
4 A) Ahora cree una carpeta con el nombre myproj en la unidad E de su disco duro y cree una nueva
carpeta con imágenes de nombre y colocar algunas imágenes en la carpeta de imágenes
(e:myproj\images\)
Supongamos que myfoto.jpg se coloca debajo
e:\myproj\images\myfoto.jpg
4 B) Ahora cree una carpeta con el nombre WEB-INF
e:\myproj\WEB-INF
y cree un web.xml en la carpeta WEB-INFCódigo en web.xml
Paso 5:
ahora cree un documento .html con el nombre index.html y colóquelo en e: \ myproj
CÓDIGO bajo index.html Bienvenido a Myproj
La estructura de directorios para los pasos 4 y 5 anteriores es la siguiente
Paso 6:
ahora inicie el servidor apache tomcat
Paso 7:
abra el navegador y escriba la url de la siguiente manera
luego muestra el contenido que se proporciona en index.html
Paso 8:
Para acceder a las imágenes en su disco duro local (fuera de webroot)
fuente
Esta es la historia de mi lugar de trabajo:
- Intentamos cargar múltiples imágenes y archivos de documentos usando Struts 1 y Tomcat 7.x.
- Intentamos escribir archivos cargados en el sistema de archivos, nombre de archivo y ruta completa a los registros de la base de datos.
- Intentamos separar las carpetas de archivos fuera del directorio de la aplicación web . (*)
La siguiente solución es bastante simple, efectiva para el requisito (*):
En un
META-INF/context.xml
archivo con el siguiente contenido: (Ejemplo, mi aplicación se ejecuta enhttp://localhost:8080/ABC
, mi aplicación / proyecto nombradoABC
). (esto también es contenido completo del archivocontext.xml
)(funciona con Tomcat versión 7 o posterior)
Resultado: hemos creado 2 alias. Por ejemplo, guardamos imágenes en:
D:\images\foo.jpg
y las vemos desde el enlace o usando la etiqueta de imagen:o
(Uso Netbeans 7.x, Netbeans parece crear automáticamente el archivo
WEB-INF\context.xml
)fuente
Si decide envío a
FileServlet
continuación, usted también necesitaráallowLinking="true"
encontext.xml
el fin de permitirFileServlet
a atravesar los enlaces simbólicos.Ver http://tomcat.apache.org/tomcat-6.0-doc/config/context.html
fuente
Si alguien no puede resolver su problema con la respuesta aceptada, tenga en cuenta las siguientes consideraciones:
localhost:<port>
con<img> src
atributo.context docBase
entrada por sí mismo dentro de suserver.xml
archivo local .fuente
Lea el InputStream de un archivo y escríbalo
ServletOutputStream
para enviar datos binarios al cliente.Resultado de la URL directamente al
src
atributo.fuente
Si desea trabajar con JAX-RS (por ejemplo, RESTEasy) intente esto:
usando
javax.ws.rs.core.Response
ycom.google.common.io.ByteStreams
fuente
Lo hice aún más simple. Problema: un archivo CSS tenía enlaces de URL a la carpeta img. Obtiene 404.
Miré la url, http: // tomcatfolder: port / img / blablah.png , que no existe. Pero, eso realmente apunta a la aplicación ROOT en Tomcat.
Así que simplemente copié la carpeta img de mi aplicación web en esa aplicación ROOT. ¡Trabajos!
No recomendado para producción, por supuesto, pero esto es para una aplicación interna de desarrollo de herramientas.
fuente