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 :

IllegalStateException lors de l'envoi d'un fichier


Sujet :

Servlets/JSP Java

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 21
    Points
    21
    Par défaut IllegalStateException lors de l'envoi d'un fichier
    Bonjour,

    J'ai une servlet qui permet de télécharger un fichier pdf. Le fichier est généré à la volée puis envoyé vers le navigateur client. Cela faisait + de 2 ans que tout fonctionnait à merveille. Ce matin, on vient me trouver pour me dire qu'on n'arrive plus à télécharger le fichier.

    Je regarde et de fait, j'ai une exception qui est levée :

    java.lang.IllegalStateException: "getOutputStream()" a déjà été appelé pour cette réponse

    Ce qui est incompréhensible, c'est que je n'ai plus touché au code depuis + d'un an et que jusqu'à présent tout était ok.

    L'application web tourne sur tomcat et j'utilise spring.

    J'ai bien fait des recherches à ce propos mais la seule info que je trouve c'est que l'on peut appeler seulement une fois la fonction response.getOutputStream(). Il me semble que c'est bien ce que je fais.

    Merci.

    voici le code de la servlet :

    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
    73
    74
    75
    76
    77
    78
    79
     
    package be.cpasdeliege.intranet.informatique.controler;
     
    import java.io.ByteArrayOutputStream;
     
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.xml.transform.Result;
    import javax.xml.transform.Source;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.sax.SAXResult;
    import javax.xml.transform.stream.StreamSource;
     
    import org.apache.fop.apps.Driver;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
     
    import be.cpasdeliege.intranet.informatique.model.domain.DomainInterface;
     
    public class GenererPDF implements Controller {
     
    	DomainInterface metier = null;
     
    	public ModelAndView handleRequest(HttpServletRequest request,
    			HttpServletResponse response) throws Exception {
     
    		String type = request.getParameter("type");
    		String saut = request.getParameter("saut");
    		if(type == null || saut == null) {
    			response.sendRedirect((String)request.getSession().getAttribute("retour"));
    		} else {
    			ByteArrayOutputStream out = new ByteArrayOutputStream();
    			Driver driver = new Driver();
    			driver.setRenderer(Driver.RENDER_PDF);
    			driver.setOutputStream(out);
    			Result resultat = new SAXResult(driver.getContentHandler());
    			Source source;
    			Source style;
    			if(type.equals("alpha")) {
    				if(saut.equals("true")) {
    					source = new DOMSource(metier.getAnnuaireAlphabetiqueXML());
    					style = new StreamSource("c:\\fop\\cpas_alpha_saut.xsl");
    				} else {
    					source = new DOMSource(metier.getAnnuaireAlphabetiqueXML());
    					style = new StreamSource("c:\\fop\\cpas_alpha.xsl");
    				}
    			} else {
    				if(saut.equals("true")) {
    					source = new DOMSource(metier.getAnnuaireServiceXML());
    					style = new StreamSource("c:\\fop\\cpas_service_saut.xsl");
    				} else {
    					source = new DOMSource(metier.getAnnuaireServiceXML());
    					style = new StreamSource("c:\\fop\\cpas_service.xsl");
    				}
    			}
    			TransformerFactory transformerFactory = TransformerFactory.newInstance();
    			Transformer transformer = transformerFactory.newTransformer(style);
    			transformer.transform(source, resultat);
    			response.setContentType("application/pdf");
    		    response.setContentLength(out.size());
    		    ServletOutputStream outputStream = response.getOutputStream();
    		    outputStream.write(out.toByteArray());
    		    outputStream.flush();
    		}
    		return null;
    	}
     
    	public DomainInterface getMetier() {
    		return metier;
    	}
     
    	public void setMetier(DomainInterface metier) {
    		this.metier = metier;
    	}
     
    }

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 111
    Points : 118
    Points
    118
    Par défaut
    L'objet HttpServletResponse response qui est en argument de l'appel de la méthode peut provenir d'un forward effectuer dans une autre servlet. Si c'est le cas et que dans les traitement de cette autre servlet tu fais déjà un response.getOutputStream() alors, la méthode à déjà été appelée sur cet objet.
    C'est juste une idée et c'est tout ce que je vois.

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Ok, merci. Je vais regarder de plus près.

Discussions similaires

  1. [WS 2008] Permission refusée lors de l'envoi de gros fichiers en SMB
    Par kedare dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 08/12/2009, 17h10
  2. Pas de signature lors d'un envoi de fichier par clic droit
    Par PPLILH2008 dans le forum Outlook
    Réponses: 1
    Dernier message: 30/05/2008, 10h37
  3. Perte de $_POST lors d'envoi de gros fichiers
    Par jpascal dans le forum Langage
    Réponses: 3
    Dernier message: 31/03/2008, 14h58
  4. Réponses: 3
    Dernier message: 21/12/2007, 18h34

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