2010-10-11 5 views
2

Je la recherche depuis un moment en ligne (Google et StackOverflow), mais je n'ai pas encore rencontré cette question. Peut-être que ma requête n'est pas correcte (veuillez rediriger alors!)Java, Tomcat 6: enregistrement de fichiers en HD local

J'ai développé et mis en place une WebApp sur TomCat 6 sous Linux. Tomcat ne fonctionne pas encore dans un environnement hôte virtuel, j'ai un contrôle total sur le serveur. Par conséquent, le fichier .war est enregistré dans le répertoire de déploiement standard de Tomcat. Le problème que je rencontre concerne les images: différents services Web fournissent des images de tailles différentes qui doivent être présentées dans des tailles uniformes. Je les télécharge et les redimensionne sans problème, mais je dois stocker une copie locale de l'image car cela prend du temps si cela est fait en temps réel, plus beaucoup de gaspillage de bande passante. Je ne les sauvegarde pas sous le dossier temp de .war sous Tomcat, en raison d'un cas où un arrêt du serveur me forcerait à recharger toutes les images.

J'ai créé un répertoire différent sous/home/nom_utilisateur/images, que je diffuse ensuite sous un sous-domaine différent via Apache standard, et le code HTML généré dans le fichier .jsp est simplement une URL correcte du fichier. Fonctionne très bien si l'image n'existe pas. Toutefois, en raison de problèmes d'autorisation, l'instance Tomcat ne peut pas supprimer ou remplacer les fichiers déjà créés, même si j'ai marqué le dossier dans lequel les images sont stockées avec des autorisations 777. En aparté, je ne vois pas le besoin de lui donner 777 perms, mais avec 755 (par exemple), j'ai eu des problèmes de permission même en essayant d'enregistrer un nouveau fichier. Donc: y a-t-il une meilleure solution (j'ai considéré la base de données, mais les images dir sont maintenant à 250mb, et je ne vois pas la nécessité de trop surcharger la base de données)?

+0

Méfiez-vous de l'enregistrement des fichiers sur le disque sans d'abord vérifier le nom du fichier; http://www.theregister.co.fr/2010/10/06/net_voting_hacked/ – Qwerky

+0

Merci pour les heads up! – mno2go

+0

En fait, juste md5 (timestamp) pour obtenir un nom de fichier :) nom pas élégant, mais assure généralement qu'il est unique. Donc pas de problèmes ici! – mno2go

Répondre

1

Ne stockez pas les images dans la base de données. Votre approche /home/user/www.example.com/resources est dans la bonne direction, il suffit de trier les problèmes de privilèges. Assurez-vous que le chemin est dans un groupe où l'utilisateur qui exécute tomcat (tomcat?) Appartient et réduisez le 777 parce qu'il est trop large.

+0

Merci cherouvim. Je n'allais pas aller pour DB, je n'ai jamais aimé cette approche. :) Je vais devoir jouer avec les permissions Linux, ce qui est ce que je pensais que le problème était. Donc, ajouter l'utilisateur tomcat (yep, correct) au groupe de propriétaire de /home/user/..../resources est la bonne approche? En outre, quelles sont les autorisations minimales nécessaires pour que cela fonctionne - 644? ou 755? Merci encore! – mno2go

+0

Oui parce que vous voulez qu'il ait un accès en lecture/écriture au dossier. Assurez-vous que le numéro du milieu (représentant un groupe) a un accès en lecture/écriture, donc un 6 fera l'affaire. – cherouvim

+0

Le stockage des fichiers dans la base de données est plus lent, mais a un énorme avantage: les transactions de base de données (propriétés ACID). Lorsque vous le stockez sur le disque, vous n'avez pas de transactions, par exemple lorsque vous enregistrez les données, puis quelque chose échoue, les données existent toujours sur le disque (ne seront pas annulées), vous devez donc gérer manuellement ou ignorer si ce n'est pas un problème important pour vous. – iirekm

0

Qu'est-ce qui se passe spécifiquement avec les autorisations? Tomcat s'exécutera en tant qu'utilisateur (par exemple tomcat1) et créera des fichiers appartenant vraisemblablement au même utilisateur (tomcat1). Si vos fichiers sont créés avec un propriétaire différent, cela explique pourquoi vous ne pouvez pas remplacer les téléchargements existants et vous devez déterminer pourquoi la propriété est différente. Si ce n'est pas la propriété, les fichiers sont créés sans autorisation d'écriture pour l'utilisateur. Dans ce cas, envisagez de définir explicitement les autorisations sur chaque fichier enregistré pour permettre au propriétaire d'y écrire ou de modifier l'umask du compte utilisateur.

+0

"ou modifier le umask du compte d'utilisateur." - hmm, idée intéressante, merci! – mno2go

1

On ne sait pas très bien si Tomcat et un autre utilisateur écrivent, ou seulement Tomcat. S'il s'agit uniquement de tomcat, le répertoire en question doit appartenir à tomcat, et les permissions peuvent être 750 (définir le groupe pour qu'il corresponde au groupe d'apache) ou 755 (le groupe n'a pas d'importance, n'importe qui sur la machine peut lire les fichiers).

Notez que si un autre utilisateur écrit des fichiers, vous devez être plus compliqué. Dans ce cas, vous avez besoin de 775, utilisateur tomcat, groupe tomcat, et placez le (s) utilisateur (s) supplémentaire (s) dans le groupe tomcat. Si ces utilisateurs sont dans plusieurs groupes, vous pouvez utiliser le bit collant du groupe sur le répertoire pour forcer le groupe à rester Tomcat. Dans ce cas, n'importe qui sur la machine peut lire ces fichiers.

La documentation pour chown et chmod devrait être d'une grande aide.

(Oui, je me rends compte que cette question est très ancienne, mais les mêmes principes s'appliquent, et personne ne semblait donner une réponse claire).