J'ai vu des suggestions telles que le fait que le répertoire d'image soit un lien symbolique pointant vers un répertoire en dehors du conteneur Web, mais cette approche fonctionnera-t-elle à la fois sur les environnements Windows et * nix?
Si vous respectez les règles de chemin du système de fichiers * nix (c'est-à-dire que vous utilisez exclusivement des barres obliques comme dans /path/to/files
), alors cela fonctionnera également sous Windows sans avoir besoin de bricoler avec File.separator
des concaténations de chaînes laides . Il ne serait cependant analysé que sur le même disque de travail que celui d'où cette commande a été invoquée. Donc, si Tomcat est par exemple installé sur, C:
alors le /path/to/files
pointerait vers C:\path\to\files
.
Si les fichiers sont tous situés à l'extérieur de l'application Web et que vous souhaitez que Tomcat les DefaultServlet
gère, tout ce que vous devez faire dans Tomcat est d'ajouter l'élément de contexte suivant /conf/server.xml
à la <Host>
balise interne :
<Context docBase="/path/to/files" path="/files" />
De cette façon, ils seront accessibles via http://example.com/files/...
. Un exemple de configuration GlassFish / Payara peut être trouvé ici et un exemple de configuration WildFly peut être trouvé ici .
Si vous voulez avoir le contrôle de lecture / écriture de fichiers vous, vous devez créer un Servlet
pour ce qui obtient fondamentalement juste un InputStream
du fichier dans la saveur de par exemple FileInputStream
et écrit au OutputStream
du HttpServletResponse
.
Sur la réponse, vous devez définir l'en- Content-Type
tête afin que le client sache quelle application associer au fichier fourni. Et, vous devez définir l'en- Content-Length
tête pour que le client puisse calculer la progression du téléchargement, sinon il sera inconnu. Et, vous devez définir l'en- Content-Disposition
tête sur attachment
si vous voulez une boîte de dialogue Enregistrer sous , sinon le client tentera de l'afficher en ligne. Enfin, écrivez simplement le contenu du fichier dans le flux de sortie de la réponse.
Voici un exemple de base d'un tel 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());
}
}
Lorsqu'il est mappé sur un url-pattern
de par exemple /files/*
, vous pouvez l'appeler par http://example.com/files/image.png
. De cette façon, vous pouvez avoir plus de contrôle sur les demandes que le DefaultServlet
fait, comme la fourniture d'une image par défaut (c'est if (!file.exists()) file = new File("/path/to/files", "404.gif")
-à- dire environ). Il request.getPathInfo()
est également préférable d' utiliser le ci request.getParameter()
- dessus car il est plus convivial pour le référencement et sinon IE ne choisira pas le nom de fichier correct lors de l' enregistrement sous .
Vous pouvez réutiliser la même logique pour servir des fichiers à partir de la base de données. Remplacez simplement new FileInputStream()
par ResultSet#getInputStream()
.
J'espère que cela t'aides.
Voir également:
<Context docBase="/path/to/images" path="/images" />
sous Windows, mais obtenant le chemin relatif au dossier webapps:C:\install\apache-tomcat-8.0.26\webapps\tmp] is not valid
<Context docBase="C:\tmp\" path="/images" />
HTTP Status 404 - /images/
en faisanthttp://localhost:8080/images/
:, MAIS un fichier spécifique soustmp
fonctionne:http://localhost:8080/images/Tulips.jpg
est OKVous pouvez le faire en mettant vos images sur un chemin fixe (par exemple: / var / images, ou c: \ images), ajouter un paramètre dans les paramètres de votre application (représenté dans mon exemple par le Settings.class), et les charger comme ça, dans l'un
HttpServlet
des vôtres:Ou si vous souhaitez manipuler l'image:
alors le code html serait
<img src="imageServlet?imageName=myimage.png" />
Bien sûr, vous devriez penser à servir différents types de contenu - "image / jpeg", par exemple en fonction de l'extension de fichier. Vous devez également fournir une mise en cache.
De plus, vous pouvez utiliser ce servlet pour un redimensionnement de qualité de vos images, en fournissant des paramètres de largeur et de hauteur comme arguments, et en utilisant
image.getScaledInstance(w, h, Image.SCALE_SMOOTH
), en tenant compte des performances, bien sûr.la source
Ajouter à server.xml:
Activez le paramètre de liste de fichiers dir dans web.xml:
la source
Condition: accéder aux ressources statiques (images / vidéos., Etc.) depuis l'extérieur du répertoire WEBROOT ou depuis le disque local
Étape 1:
Créez un dossier sous les applications Web du serveur tomcat., Disons que le nom du dossier est myproj
Étape 2:
Sous myproj, créez un dossier WEB-INF sous celui-ci, créez un simple fichier web.xml
code sous web.xml
Structure de répertoire pour les deux étapes ci-dessus
Étape 3:
Créez maintenant un fichier xml avec le nom myproj.xml sous l'emplacement suivant
CODE dans myproj.xml:
Étape 4:
4 A) Créez maintenant un dossier avec le nom myproj dans le lecteur E de votre disque dur et créez un nouveau
dossier avec le nom des images et placez certaines images dans le dossier images
(e:myproj\images\)
Supposons que myfoto.jpg soit placé sous
e:\myproj\images\myfoto.jpg
4 B) Créez maintenant un dossier avec le nom WEB-INF dans
e:\myproj\WEB-INF
et créez un web.xml dans le dossier WEB-INFCode dans web.xml
Étape 5:
Créez maintenant un document .html avec le nom index.html et placez-le sous e: \ myproj
CODE sous index.html Bienvenue sur Myproj
La structure de répertoire pour les étapes 4 et 5 ci-dessus est la suivante
Étape 6:
Démarrez maintenant le serveur apache tomcat
Étape 7:
ouvrez le navigateur et saisissez l'url comme suit
puis vous affichez le contenu fourni dans index.html
Étape 8:
Pour accéder aux images sous votre disque dur local (en dehors de webroot)
la source
Voici l'histoire de mon lieu de travail:
- Nous essayons de télécharger plusieurs images et les fichiers de documents utilisent Struts 1 et Tomcat 7.x.
- Nous essayons d'écrire les fichiers téléchargés dans le système de fichiers, le nom de fichier et le chemin complet des enregistrements de la base de données.
- Nous essayons de séparer les dossiers de fichiers en dehors du répertoire de l'application Web . (*)
La solution ci-dessous est assez simple, efficace pour l'exigence (*):
Dans un
META-INF/context.xml
fichier avec le contenu suivant: (Exemple, mon application s'exécute àhttp://localhost:8080/ABC
, mon application / projet nomméABC
). (c'est aussi le contenu complet du fichiercontext.xml
)(fonctionne avec Tomcat version 7 ou ultérieure)
Résultat: nous avons créé 2 alias. Par exemple, nous enregistrons les images sur:
D:\images\foo.jpg
et les visualisons à partir d'un lien ou en utilisant une balise d'image:ou
(J'utilise Netbeans 7.x, Netbeans semble créer un fichier automatiquement
WEB-INF\context.xml
)la source
Si vous décidez d'envoyer à,
FileServlet
vous aurez également besoinallowLinking="true"
decontext.xml
pour permettreFileServlet
de parcourir les liens symboliques.Voir http://tomcat.apache.org/tomcat-6.0-doc/config/context.html
la source
si quelqu'un n'est pas en mesure de résoudre son problème avec une réponse acceptée, notez les considérations ci-dessous:
localhost:<port>
avec<img> src
attribut.context docBase
entrée seule dans sonserver.xml
fichier local .la source
Lisez le InputStream d'un fichier et écrivez-le
ServletOutputStream
pour envoyer des données binaires au client.Résultat l'URL directement à l'
src
attibute.la source
Si vous souhaitez travailler avec JAX-RS (par exemple RESTEasy), essayez ceci:
en utilisant
javax.ws.rs.core.Response
etcom.google.common.io.ByteStreams
la source
Je l'ai fait encore plus simple. Problème: un fichier CSS contenait des liens URL vers le dossier img. Obtient 404.
J'ai regardé l'url, http: // tomcatfolder: port / img / blablah.png , qui n'existe pas. Mais cela pointe vraiment vers l'application ROOT dans Tomcat.
Je viens donc de copier le dossier img de mon application Web dans cette application ROOT. Travaux!
Non recommandé pour la production, bien sûr, mais c'est pour une application de développement d'outils interne.
la source