IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

[Débutant] Télécharger une ressource hors de son projet


Sujet :

Développement Web en Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 98
    Points : 35
    Points
    35
    Par défaut [Débutant] Télécharger une ressource hors de son projet
    Desolé pour la question qui dois surement paraitre bete a beaucoup de programmeurs experimentés....

    L'url de mon appli (Struts) est :
    http:\\monhote:port\monAppli\

    Les fichiers uploadés sont stockés sur mon serveur dans un repertoire different de celui de mon application.

    Hors je scanne ce repertoire pour permettre de downloader les liens.
    Sur ma jsp j'obtiens donc un lien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a href="/chemin/du/repertoire/sur/mon/serveur/MonFichier.csv"/>"
    Du coup lorsque je clique dessus il va chercher sur:
    http:\\monhote:port\monAppli\chemin\du\repertoire\sur\mon\serveur\MonFichier.csv
    et forcement ne trouve rien.
    Vous me direz forcement d'utiliser les chemins relatifs ce qui me pose probleme pour des questions de portabilité...

    N'existe t'il pas un moyen pour faire un lien downloadant mes ressources hors projet en utilisant struts (par exemple) afin d'ameliorer la portabilité ?

    edit:
    d'ailleurs en utilisant ../../../dossier/de/ma/ressource/MonFichier.csv en lien il me renvois sur :
    http:\\monhote:port\monAppli\dossier\de\ma\ressource\MonFichier.csv

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 816
    Points
    1 816
    Par défaut
    Je vois trois problèmes avec votre méthode. (Ne vous inquiétez pas, vous débutez, c'est normal.)
    1. Votre programme serveur WEB (Tomcat, Apache, JBoss ou autre...) interprète probablement l'adresse :
    http:\\monhote:port\monAppli\chemin\du\repertoire\sur\mon\serveur\
    De la façon suivante :
    <dossier d'installation de votre appli web>\chemin\du\repertoire\sur\mon\serveur\
    et non :
    C:\chemin\du\repertoire\sur\mon\serveur\
    En fait, en mettant /chemin/du/repertoire/sur/mon/serveur/
    dans l'url, vous donnez une information sur votre serveur à un pirate éventuel. (Un pirate qui saurait exploiter cette information n'en aurait probablement pas besoin, mais autant leur compliquer la vie.)

    2. Que se passe-t-il si on uploade deux fichiers différents, mais portant le même nom ?

    3. Est-ce que tous les utilisateurs ont le droit d'accès à tous les fichiers? Que se passe-t-il si un comique s'amuse à changer le nom de fichier directement dans la barre d'adresse?

    Je vous recommande donc une autre solution.
    Premièrement, quand un utilisateur charge un fichier vers votre serveur, enregistrez le dans votre répertoire avec un nom que vous générez vous même, de façon à ce que deux fichiers ne puissent pas avoir le même nom. Assurez vous de pouvoir retrouver la correspondance nom généré --> nom d'origine, soit en enregistrant les noms dans une base de donner, soit en incluant le nom d'origine dans le nom généré. Par exemple, conservez un compteur que vous incrémentez de un à chaque fichier, et prenez <valeur du compteur>_nom d'origne comme nom de fichier.

    Deuxièmement, créez une servlet ou une action Struts (je ne sais pas si c'est faisable avec Struts) qui renvoie en sortie non du texte, mais un flux binaire, et qui prenne en paramètre le nom généré d'un fichier. Quand elle est appelée, elle vérifie qu'un fichier portant ce nom existe et que l'utilisateur en cours à le droit d'y accéder s'il y a lieur. Si c'est le cas, elle envoie en sortie le fichier, en le lisant byte par byte et en le renvoyant sur sa sortie. Sinon, redirection vers un message d'erreur. Grâce à elle, on peut télécharger le fichier.

    Troisièmement, modifiez la page qui affiche la liste des fichier. Les liens ne sont plus :
    <a href="/chemin/du/repertoire/sur/mon/serveur/MonFichier.csv"/>
    mais
    <a href="/servletOuActionTelechargement?nomFichier=nom GENERE du fichier">nom d'ORGINE du fichier</a>

    Ca fait plus de boulot, mais ça marche.

    Quelques subtilités. Attention, ici, je pinaille, vous êtes prévenu.
    1. Si vous utilisez la solution générant un nom de fichier avec un compteur, méfiez vous de la possibilité que deux utilisateurs y accèdent en même temps. En effet, le serveur exécute les requêtes simultanément sur plusieurs threads (si vous ne savez pas ce que c'est, vous êtes bon pour lire les tutoriaux). Et l'utilisation du compteur s'effectue en deux étapes : ajouter 1, et lire sa valeur pour générer le nouveau nom. Si le serveur change de client entre les deux étapes, ils peuvent se retrouver avec la même valeur! Il faut donc utiliser le mot clé synchronized pour empêcher ça.
    2. Si vous ajoutez le nom d'origine du fichier à la fin du nom généré, vérifier qu'il ne contient pas de caractères interdits par votre système de fichier. Il y a des comiques qui sont capables de vous envoyer un fichier dont le nom contient des "\"...
    3. Un petit scan antivirus sur tous les fichiers qu'on vous envoie, ce n'est pas plus mal, et attention aux bombes de décompression!
    Eh oui, tous ce qui vient de l'extérieur est suspect, et pas seulement pour M. Hortefeux.

    Petit coup de pouce : pour renvoyer des données binaires depuis une servlet, utilisez response.getOutputStream().write.

    Bon courage.

Discussions similaires

  1. [WD17] Utilisation code d'une WDL sans ouvrir son projet.
    Par Jefty dans le forum WinDev
    Réponses: 0
    Dernier message: 14/01/2015, 16h45
  2. Applet qui refuse de charger une ressource issue de son propre domaine
    Par barnabé2 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 28/01/2010, 23h49
  3. [Débutant] Ajouter à une fenêtre une icone des ressources du projet
    Par Thomsy92 dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 26/08/2009, 01h53
  4. [VB6]:Créer une application de son projet
    Par gaetan.tranvouez dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 21/07/2006, 09h26
  5. [MFC] Copier une ressource vers un autre projet
    Par annedjomo dans le forum MFC
    Réponses: 7
    Dernier message: 25/01/2006, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo