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

Servlets/JSP Java Discussion :

Effacer des fichiers temporaires


Sujet :

Servlets/JSP Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 74
    Points : 41
    Points
    41
    Par défaut Effacer des fichiers temporaires
    Bonjour,

    Je génère via une servlet une page web qui contient des images. J'aimerai une fois que celle-ci (la page avec toutes ses images) est fini de charger, supprimer toutes les images temporaires.
    est-ce possible et si oui comment ?
    Merci pour vos réponses.

  2. #2
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Salut!

    Tu as deux approches possibles à mon sens si tu as des images temporaires générées. Dans tous les cas, il ne faut pas que tes images soient générées en fichier, parce que tu ne sauras jamais quand tu peux les supprimer (ton code serveur est déclenché par les appels client, rien de plus).
    1) Les images sont générées directement dans le html (voir par exemple http://www.elf.org/essay/inline-image.html). Mais cela pose pas mal de problèmes de compatibilité avec IE, de lenteur etc ...
    2) Les images sont elles mêmes générées par des servlets. En effet, une servlet peut très bien générer n'importe quel type de contenu, pas seulement du html ...

  3. #3
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Merci chtig pour ta réponse rapide.

    En fait j'ai une servlet qui fait appel à BIRT qui est un moteur de génération de rapport et c'est lui qui me génère des images qu'il stocke dans le repertoire que je lui ai indiqué. Est-ce cette manière de procéder que tu appelles "générer des images via la servlet" ? si oui, ce que j'aimerais fiare, c'est qu'une fois que tout est chargé, aller vider le fameux repertoire où ils stockent ses fichiers temporaires (il n'y a pas que des images d'ailleurs...).

    P.S : Le lien que tu m'as donné semble ne pas fonctionner

  4. #4
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Etrange, le lien fonctionne pour moi ...
    Je ne savais pas que tu utilisais un moteur de génération de rapport. Dans ce cas, c'est légèrement différent. Il faut que tu fasses une servlet qui appele le rapport, lit le fichier en mémoire, efface le rapport, et envoi le contenu de la mémoire dans la réponse en content/type adéquat.

    Je ne suis pas sûr d'être clair. Prenons un exemple :
    - J'ai une servlet HtmlGenerator qui est mappée sur l'url /html
    - J'ai une servlet ImageGenerator qui est mappée sur l'url /image

    lorsque le navigateur appelle l'url /html?dateDebut=01012008&dateFin=01012009, il reçoit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <html>
    <body>
    <img src="/image?dateDebut=01012008&dateFin=01012009">
    </body>
    </html>
    Il appelle alors l'url /image?dateDebut=01012008&dateFin=01012009 qui est elle même une servlet qui :
    - Génère l'image en fichier avec BIRT
    - Met le content/type de la réponse à ce qu'il faut
    - Lit le fichier et écrit son contenu dans la réponse
    - Supprime le fichier

    C'est plus clair ?

  5. #5
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Chtig,

    Je débute en Servlet, donc en gros j'ai cette méthode DoGet extraite de la Servlet BirtServlet qui appelle ci-dessous une autre Servlet Editionv2. C'est cette dernière qui génère mon rapport et qui crée donc mes fameux fichiers temporaires.
    Par rapport à ce que tu m'as indiqué, j'ai l'impression de ne pas être loin de ce que tu me proposes, mais néanmoins je bloque pour la suppression des fichiers temporaires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//Store the report to generate
    		String rptdesignFile = request.getParameter("__report");
    		//Store the generation format
    		String outputFormat = request.getParameter("outputFormat");
    		//Store the mode of generation
    		String genMode = request.getParameter("genMode");	
     
    		String reportPath = new String();	
    		String imageDirectory = new String();	
    		String birtReportEngine = new String();
     
    		try {
    			ConfXML settingParamatersconf = new ConfXML();
    			//Store the report directory path (where all rptdesign files arestored)
    			reportPath = settingParamatersconf.getTagValue("reports-path-directory");
    			imageDirectory = settingParamatersconf.getTagValue("image-directory");
    			birtReportEngine = settingParamatersconf.getTagValue("report-engine");
    			System.out.println("reportPath = "+reportPath);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
    		// Get the values set by the application for all parameters.
    		HashMap myParametersList = new HashMap();
    		// Store parameters values depending on reports
    		if (rptdesignFile.equals("priority_by_status.rptdesign")){
    			myParametersList.put("niveau_criticite", request.getParameter("niveau_criticite"));
    			myParametersList.put("issue_type", request.getParameter("issue_type"));
    		}
     
    		Editionv2 genrationRapport = new Editionv2();
    		//Initialization of Editionv2 instance
    		genrationRapport.initEdition(birtReportEngine,
    										reportPath+rptdesignFile,
    										myParametersList,
    										outputFormat,
    										(reportPath+rptdesignFile).replaceFirst( ".rptdesign", "."+outputFormat.toLowerCase()),
    										genMode,
    										imageDirectory,
    										request.getContextPath() );
     
    		//Generate
    		genrationRapport.run();
     
     
    		//set the appropriate MIME type according to the output format
    		if (outputFormat.equals("HTML") || genMode.equals("DEP")){
    			response.setContentType("text/html");
    		} else if ( outputFormat.equals("PDF")) {
    			response.setContentType("application/pdf");
    		} else if ( outputFormat.equals("XLS")) {
    			response.setContentType("application/vnd.ms-excel");
    			//response.setHeader("Content-disposition","inline; filename=nombre.csv");
    		} else if ( outputFormat.equals("DOC")) {
    			response.setContentType("application/msword");
    		} else {
    			response.setContentType("text/html");
    		}
     
    		response.setHeader("Cache-Control","must-revalidate");
     
    		if (genMode.equals("AFF")) {
    			//Get the output stream of the servlet
    			OutputStream outputStreamServlet = response.getOutputStream();
    			//Copy stream generating by the report into the output stream of the servlet
    			((ByteArrayOutputStream) genrationRapport.getOptions().getOutputStream()).writeTo(outputStreamServlet);
    			//Close the stream
    			outputStreamServlet.close();
    		}
    	}
    Partir de la méthode qui fait appel à la Servlet de génération de rapport :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Editionv2 genrationRapport = new Editionv2();
    		//Initialization of Editionv2 instance
    		genrationRapport.initEdition(birtReportEngine,
    										reportPath+rptdesignFile,
    										myParametersList,
    										outputFormat,
    										(reportPath+rptdesignFile).replaceFirst( ".rptdesign", "."+outputFormat.toLowerCase()),
    										genMode,
    										imageDirectory,
    										request.getContextPath() );
     
    		//Generate
    		genrationRapport.run();

  6. #6
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ta servlet est en effet capable de générer le rapport selon plusieurs formats. Quel format utilises-tu actuellement ?

  7. #7
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    J'utilise le format HTML, les images générer sont du PNG. Je lui ai indiqué de stocker ses images dans <MON_HOME>/images.

  8. #8
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Comme c'est du "tout fait" à mon sens là c'est vraiment problématique...
    La seule solution que je vois demanderait de générer autant de fois le rapport que tu as d'images ce qui est assez horrible ....

  9. #9
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Il n'y a pas un moyen de faire un truc du style :

    - Appel à la génération du rapport
    - On laisse la servlet s'éxecuter en entier
    - Une fois terminé, on va supprimer dans le dossier les fichiers temporaires

    Raisonner de la sorte n'est pas possible ?

  10. #10
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Il me semble que tu n'as pas bien compris le détail. Regardons ce qui se passe dans le détail :

    1- le navigateur appelle le rapport
    2- la servlet calcule le rapport, enregistre les images et renvoie le html au navigateur
    3- le navigateur recoit le html et voit qu'il inclue des images
    4- le navigateur demande les images une à une au serveur

    ta servlet a terminé son boulot après l'étape 2. Le problème est que si tu supprimes les images à ce moment là le navigateur ne les a pas encore chargées.

  11. #11
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Ok ok, je comprends. C'est bien ce qui me semblait, car lorsque que j'efface les images après à la fin de l'appel, la navigateur n'affiche pas les images.
    Merci de d'être penché sur mon problème, je vais continuer à me pencher sur le problème, un collègue m'a dit que JFreeChart avait un mécanisme de la sorte. Je vais essayer de voir ça.

  12. #12
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Pas de souci. Et désolé de ne pouvoir faire mieux ...
    J'ai peut être une dernière idée : connais-tu par avance l'url des images qui vont être générées ? (par exemple sont-elles toujours dans le même répertoire)

  13. #13
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Le nom de l'image est généré aléatoirement mais le répertoire dans lequel elles sont stockées est toujours le même.

  14. #14
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Quelle architecture as-tu ? (combien de serveurs, quels serveurs d'application/http etc ...)

  15. #15
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Pour l'instant je travaille en local sur mon poste. J'ai installé Apache Tomcat. Ma SGBD est PostGre.

  16. #16
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Je ne vois pas de solution simple, mais j'ai une solution.
    Elle consiste à ce que :
    1) Les urls des images atterissent sur une servlet et non sur les fichiers directement
    2) Que la servlet lise le fichier, le donne en réponse au navigateur et supprime le fichier.

    Tu te sens de faire quelquechose comme ca ?

  17. #17
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    si tu peux juste me donner un coup de main pour démarrer en m'expliquant ce que tu entends exactement par "1) Les urls des images atterissent sur une servlet et non sur les fichiers directement" avec par exemple un bout de code ce serait nikel, après je vais essayer de faire le reste !

    Je te précise juste que je n'ai aucun controle sur les images, elles sont générés par le moteur BIRT et déposé dans le repertoire que je lui ai indiqué.

  18. #18
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ben c'est pas du code là, c'est de la configuration pour le 1 ... Ca se fait avec le fichier web.xml.
    Tu pourrais l'uploader et me donner l'url du répertoire de tes images ?

  19. #19
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Voici mon fichier Web.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    	<display-name>BirtWebProject</display-name>
    	<servlet>
    		<description></description>
    		<display-name>BirtServletv2</display-name>
    		<servlet-name>BirtServletv2</servlet-name>
    		<servlet-class>monPackage.BirtServletv2</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>BirtServletv2</servlet-name>
    		<url-pattern>/BirtServletv2</url-pattern>
    	</servlet-mapping>
     
    	<welcome-file-list>
    		<welcome-file>index.jsp</welcome-file>
    		<welcome-file>default.jsp</welcome-file>
    	</welcome-file-list>
     
    </web-app>
    L'url des images est :http://localhost:8080/birt-web-project/images/

  20. #20
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Il faut rajouter ça à ton web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <servlet>
    		<servlet-name>images</servlet-name>
    		<servlet-class>
    			monPackage.ImageServlet
    		</servlet-class>
    	</servlet>
     
    	<servlet-mapping>
    		<servlet-name>images</servlet-name>
    		<url-pattern>/images/*</url-pattern>
    	</servlet-mapping>
    Ensuite, il faut que tu crées la classe ImageServlet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    import java.io.File;
    import java.io.FileInputStream;
     
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    public class ImageServlet extends HttpServlet {
    	@Override
    	public void doGet(HttpServletRequest request, HttpServletResponse response) {
    		File image = new File(request.getPathTranslated());
    		FileInputStream input = new FileInputStream(image);
    		ServletOutputStream output = response.getOutputStream();
    		response.setContentType("image/jpeg");
    		int readByte;
    		while ((readByte = input.read()) != -1) {
    			output.write(readByte);
    		}
    		input.close();
    		output.close();
    		image.delete();
    	}
    }
    A changer le content type si tes images ne sont pas du jpeg. Dis moi ce que ça donne
    [/CODE]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Effacer des fichiers au démarrage de Tomcat?
    Par locuelas dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 11/06/2007, 18h02
  2. Win 2000 Server : Nettoyage du server des fichiers temporaires.
    Par snoopy69 dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 12/10/2006, 07h41
  3. Suppression des fichiers temporaires (TMP)
    Par alainn dans le forum Access
    Réponses: 1
    Dernier message: 17/06/2006, 10h01
  4. Y as il des fichiers temporaires sous builder
    Par Moutonstar dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/12/2004, 14h24
  5. Comment changer le répertoire des fichiers temporaires ?
    Par devdev dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 01/09/2004, 14h18

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