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

Struts 2 Java Discussion :

Download de fichier


Sujet :

Struts 2 Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut Download de fichier
    Bonjour, je rencontre actuellement des problemes dans le téléchargement de fichiers avec Struts 2.

    Voici le code que je réalise :

    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
     response.flushBuffer();
     
                	ServletOutputStream outputStream = response.getOutputStream();
                      byte[] rb = currentCategory.getNouveau();
                      outputStream.write(rb, 0, rb.length);
     
                      String propsPath = request.getSession()
                                                .getServletContext()
                                                .getRealPath("") +
                          File.separator + "WEB-INF" + File.separator +
                          "classes" + File.separator +
                          "tablemapping.properties";
                      InputStream conf = new FileInputStream(propsPath);
                      Properties db_prefs = new Properties();
                      db_prefs.load(conf);
     
                      String mimeType = db_prefs.getProperty(
                              "table.category.column.Nouveau.mimetype");
                      response.setContentType(mimeType);
                      response.setHeader("Content-Disposition",
                          "filename=nouveau" +
                          this.getFileExtension(mimeType));
    Mon problème est que lorsque je lance le téléchargement, la fenêtre s'affiche correctement mais le nom du fichier est monAction.action ....

    Mais si je le télécharge et que je le renomme avec la bonne extension cela fonctionne. J'ai essayé de faire le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    response.setContentType(mimeType);
    response.setHeader...
    en premier mais j'ai le même résultat

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Par défaut
    Pour downloader un fichier j'utilise la méthode suivante :

    créer une action dans struts.xml avec un result de type stream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <action name="DownloadFile" class="actions.DownloadFile">
      <result name="success" type="stream">
        <param name="contentType">application/download</param> 
        <param name="inputName">inputStream</param> 
        <param name="bufferSize">1024</param>
        <param name="contentDisposition">attachment;filename=${fileName}</param>
        <param name="contentLength">${fileSize}</param>
      </result>
    </action>
    Dans la classe action DownloadFile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    public class DownloadFile extends ActionSupport{
      private InputStream inputStream;
      private String fileName;
      private String fileSize;
      //... plus les get / set qui vont avec
     
      public String execute(){
        fileName = le nom du fichier;
        fileSize = la taille du fichier;
        inputStream = new FileInputStream(chemin du fichier);
      }
    }
    Comme ça le navigateur ouvre un popup avec le nom du fichier à télécharger, et avec la taille du fichier il peut afficher la barre de progression.

  3. #3
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Essaye ca (attachement pour forcer le telechargement, et filename pour le nom du fichier à donner par defaut au fichier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    response.setContentDisposition("attachment;filename=document.pdf")
    par contre je ne comprends pas comment tu arrives à télécharger ton fichier car la méthode que tu donnes ne devrait pas marcher avec STRUTS 2 mais seulement STRUTS 1.

  4. #4
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut Déterrage
    Bonjour tout le monde

    Je me permet de déterrer ce topic car je rencontre un problème lors du téléchargement d'un fichier XML.

    Actuellement je souhaite utiliser Apache FOP pour créer des fichiers XML et PDF à partir d'objets. Pour le moment je teste seulement la génération et le téléchargement d'un XML.

    Mon problème : Je sais que la génération du fichier fonctionne, mais il n'est jamais proposé au téléchargement.

    Mon action a cette forme dans le fichier struts.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <action name="exportAsXML" method="exportAsXML" class="com.mycompany.product.struts.actions.MetriqueListAction">
    	<result name="success" type="stream">
    		<param name="inputName">xml</param>
    		<param name="contentType">application/download</param>
    		<param name="contentDisposition">attachment;filename="export.xml"</param>
    		<param name="bufferSize">1024</param>
    	</result>
    </action>
    La classe ressemble à ceci (juste un extrait) :
    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
     
    public class MetriqueListAction extends AbstractArianeAction
    {
    	private static Logger logger = Logger.getLogger(MetriqueListAction.class);
    	[ ... ]
    	private File xml;
    	[ ... ]
    	public String exportAsXML()
    	{
    		if (logger.isDebugEnabled())
    		{
    			logger.debug("Methode exportAsXML");
    		}
    		try
    		{
    			xml = new File("ResultObj2XML.xml");
    			OutputStream out = new java.io.FileOutputStream(xml);
    			out = new java.io.BufferedOutputStream(out);
     
    			TransformerFactory factory = TransformerFactory.newInstance();
    			Transformer transformer = factory.newTransformer();
     
    			/*
    			 * Objet contenant le document à exporter.
    			 */
    			ExportDocument document = new ExportDocument();
     
    			/*
    			 * getSourceForExportDocument réalise la création de la source
    			 * depuis la méthodes parse, et etc...
    			 */
    			Source src = document.getSourceForExportDocument(getLocale());
     
    			// Setup output
    			Result res = new StreamResult(out);
     
    			// Start XSLT transformation
    			transformer.transform(src, res);
    			out.close();
    			return SUCCESS;
    		} catch (Exception e)
    		{
    			logger.error("Listing objects failed", e);
    			return ERROR;
    		}
    	}
    	[ ... ]
    	public InputStream getXml()
    	{
    		try
    		{
    			logger.debug("xml=" + xml.getCanonicalPath());
    			InputStream is = new FileInputStream(xml);
    			return is;
    		} catch (Exception e)
    		{
    			logger.error("bug", e);
    			return null;
    		}
    	}
    Le logger.debug de getXml() me renvoie le chemin_sur_ma_machine/ResultObj2XML.xml

    Je me demande si ça ne vient pas de là, j'avoue ne pas être à l'aise avec la manipulation des Stream...
    Quelqu'un a une idée ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 92
    Par défaut
    Le contenu de ton fichier de sorti doit être mis dans une variable de type InputStream nommée par exemple inputStream au niveau de ton Action.

    Ensuite au niveau de ton action dans le struts.xml tu dois avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <action name="exportAsXML" method="exportAsXML" class="com.mycompany.product.struts.actions.MetriqueListAction" >
         <result name="success" type="stream">
              <param name="inputName">inputStream</param>
              <param name="contentType">application/octet-stream</param>
              <param name="contentDisposition">filename="export.xml"</param>
              <param name="bufferSize">1024</param>
         </result>
    </action>

  6. #6
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut
    Bonjour kiwwi209, et merci de t'intéresser à mon problème.

    Citation Envoyé par kiwwi209 Voir le message
    Le contenu de ton fichier de sorti doit être mis dans une variable de type InputStream nommée par exemple inputStream au niveau de ton Action.
    En fait c'est à peu prés ce que je fais, seulement au lieux d'avoir une variable(attribut) de type InputStream appelée inputStream (qui est juste la valeur par défaut il me semble), j'ai un attribut de type File appelé xml.

    Et dans la fonction getXml(), comme tu peux le voir, je retourne le FileInputStream créé à partir de mon fichier xml.

    J'ai essayé de changer le contentType pour application/octet-stream et contentDisposition pour filename="export.xml" mais cela ne change rien.
    J'ai également fait afficher dans le log le contenu du FileInputStream retourné par la fonction getXml(), et les données sont correctes, j'ai le code XML cohérent.

    Il faut vraiment que mon attribut soit de type InputStream et que je le retourne tel quel ? Ou le fait d'avoir un File et de retourner par un petit traitement l'InputStream "associé" fonctionne aussi ?
    Je n'en verrais pas la raison, mais c'est toujours possible...

    Merci encore

Discussions similaires

  1. Réponses: 13
    Dernier message: 21/12/2005, 12h04
  2. download de fichier depuis un serveur web
    Par minusette dans le forum Modules
    Réponses: 9
    Dernier message: 14/10/2005, 09h10
  3. [Javabean/sun.net.ftp] Downloader un fichier txt
    Par benben13 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 13/09/2005, 16h43
  4. [C#] Download de fichier
    Par Scorff dans le forum ASP.NET
    Réponses: 2
    Dernier message: 27/06/2005, 10h09
  5. [VB.NET] Download de fichiers sur un serveur...
    Par Webman dans le forum ASP.NET
    Réponses: 3
    Dernier message: 19/05/2004, 10h25

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