“No se permite cargar el recurso local: file: /// C: … jpg” Java EE Tomcat

Intento recuperar una imagen de mi sistema de archivos después de un buen almacenamiento (en lugar de ponerlo en la base de datos, lo copio en el disco y coloco la ruta a la base de datos)

  1. Tenía almacenar la imagen en la carpeta c: \ images \ y suponiendo que el nombre de la ruta completa es c: \ images \ mypic.jpg
  2. cuando trato de recuperarlo, establezco el atributo img src en usando algún código java
  3. en la consola del navegador encontré este error Not allowed to load local resource: file:///C://images//mypic.jpg

Pregunta: ¿cómo solucionar este problema de ruta? ¿Dónde debería almacenar las imágenes? y desde donde debería recuperarlos?

el envío de la etiqueta hará que el navegador del usuario acceda a la imagen desde su sistema de archivos. si tiene que almacenar imágenes en una carpeta ubicada en c:\images le sugiero que cree un servlet como images.jsp, que como parámetro toma el nombre de un archivo, luego establece el contenido de la respuesta del servlet en una imagen / jpg y luego carga bytes de la imagen de la ubicación del servidor y ponerlo a una respuesta.

¿Pero qué usas para crear tu aplicación? ¿es servlet puro? ¿Primavera? JSF?

Aquí puedes encontrar información sobre cómo hacerlo.

En Chrome, se supone que debes poder permitir esta capacidad con un indicador de tiempo de ejecución –allow-file-access-from-files

Sin embargo, parece que hay un problema con las versiones actuales de Chrome (37, 38) donde esto no funciona a menos que también pase el indicador de tiempo de ejecución –disable-web-security

Esa es una solución inaceptable, excepto quizás como una solución temporal a corto plazo, pero se ha identificado como un problema: https://code.google.com/p/chromium/issues/detail?id=379206

Tienes dos alternativas:

El primero es crear un ServletImageLoader que tomaría como parámetro un identificador de su imagen (la ruta de la imagen o un hash) que usará dentro del servlet para manejar su imagen, y se imprimirá en la secuencia de respuesta cargada. imagen del servidor.

El segundo es crear una carpeta dentro de la carpeta ROOT de su aplicación y simplemente guardar la ruta relativa a sus imágenes.

Muchos navegadores han cambiado sus políticas de seguridad para no permitir más la lectura de datos directamente desde archivos compartidos o incluso recursos locales. Debe ubicar los archivos en algún lugar para que su instancia de tomcat pueda servirlos y poner una url http “regular” en el html que genere. Esto se puede lograr proporcionando un servlet que lea y proporcione el archivo que coloca el archivo en un directorio donde tomcat lo publicará como contenido “estático”.

El concepto de ubicación http y ubicación del disco es diferente. Lo que debes hacer es:

  1. para el archivo subido summer.jpg
  2. mueva eso debajo de una ubicación conocida (a la aplicación) en el disco, por ej. c:\images\summer.jpg
  3. insertar en el registro de db que representa la imagen con el texto summer.jpg
  4. para mostrarlo use plain
  5. necesita algo (por ejemplo, apache) que sirva c:\images\ en las /images aplicaciones. Si no puede hacer esto, en el paso n. ° 2 debe guardar en algún lugar debajo de su raíz web, por ejemplo, c:\my-applications\demo-app\build\images

Este error significa que no puede cargar datos directamente desde el sistema de archivos porque hay problemas de seguridad detrás de esto. La única solución que conozco es crear un servicio web para servir archivos de carga.

Aquí hay una solución expressjs simple si solo desea ejecutar esta aplicación localmente y la seguridad no es una preocupación:

En su archivo server.js o app.js , agregue lo siguiente:

 app.use('/local-files', express.static('/')); 

Eso servirá a su directorio raíz TOTAL en /local-files . Huelga decir que esta es una muy mala idea si planea implementar esta aplicación en cualquier lugar que no sea su máquina local.

Ahora, simplemente puede hacer:

  

nota: estoy ejecutando macOS. Si está utilizando Windows, es posible que deba buscar y eliminar ‘C: \’ de la cadena de ruta

No utilice la RUTA ABSOLUTA para referirse al nombre de la imagen, por ejemplo: C:/xamp/www/Archivos/images/templatemo_image_02_opt_20160401-1244.jpg . Debe usar la referencia a su ubicación dentro del servidor web. Por ejemplo, usando ../../Archivos/images/templatemo_image_02_opt_20160401-1244.jpg dependiendo de dónde se está ejecutando su proceso.