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

ASP.NET Discussion :

problème création ZIP avec DotNetZip


Sujet :

ASP.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut problème création ZIP avec DotNetZip
    Bonjour à tous,

    Sur le site que je suis en train de développer j'ai une page qui me permet d'exporter des commandes en PDF mais aussi d'exporter un récapitulatif en CSV des produits commandés/retournés. Pour le moment ces deux exports se font grâce à deux boutons distincts, cependant j'aimerais avoir le PDF et le CSV dans un même fichier ZIP.

    Pour le CSV pas de problème par contre avec le PDF j'ai quelque soucis =(

    Pour créer mon PDF j'utilise iTextSharp et pour le ZIP DotNetZip. Voici le code de test (adapté en vb de celui présent dans iText in Action, Second Edition (qui est, au passage, excellent ))

    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
    Imports Ionic
    Imports Ionic.Zip
    Imports Ionic.Zip.ZipOutputStream
    Imports Ionic.Zip.ZipEntry
     
    Protected Sub bt_export_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Traitement.Click
            Using zipFile As Ionic.Zip.ZipOutputStream = New Ionic.Zip.ZipOutputStream("Extraction.zip")
                zipFile.PutNextEntry("test.pdf")
                Dim nouveauDocument As New Document(PageSize.A4)
                Dim writer As PdfWriter = PdfWriter.GetInstance(nouveauDocument, zipFile)
                writer.CloseStream = False
                nouveauDocument.Open()
                nouveauDocument.Add(New Paragraph("Hello World!"))
                nouveauDocument.Close()
                zipFile.Close()
            End Using
    End Sub
    Lorsque je clique sur le bouton "bt_export" la barre de chargement de mon navigateur (firefox) apparaît, la page est rafraîchie mais, le téléchargement de l'archive ne m'est pas proposé.

    Voilà j'attends vos remarques/suggestions !

    D'avance merci.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Lenn0x Voir le message
    Lorsque je clique sur le bouton "bt_export" la barre de chargement de mon navigateur (firefox) apparaît, la page est rafraîchie mais, le téléchargement de l'archive ne m'est pas proposé.
    Ben c'est normal, tu n'as rien fait pour ça... Tu as juste écrit un fichier sur le disque, ASP.NET est pas supposé savoir que tu veux l'envoyer au client.

    Pour l'envoyer, ajoute ça à la fin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Response.AddHeader("Content-Disposition", "attachment; filename=Extraction.zip")
    Response.AddHeader("Content-Disposition", new FileInfo("Extraction.zip").Length.ToString())
    Response.TransmitFile("Extraction.zip")
    Par contre, tu devrais utiliser un fichier temporaire avec un nom aléatoire (obtenu avec Path.GetTempFileName) pour écrire le zip, sinon tu vas avoir des problèmes si 2 utilisateurs essaient de faire un export au même moment... D'ailleurs tu n'es même pas obligé de passer par un fichier, tu pourrais zipper directement sur le flux de la réponse. L'inconvénient est que si tu fais ça, tu ne peux pas connaitre la longueur à l'avance pour spécifier le Content-Length. Une autre option est de passer par un un MemoryStream.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Merci pour la réponse tomlev.

    En rajoutant les Response.AddHeader j'ai le même problème que j'ai eu lors d'un test précédent, à savoir que le ZIP est bien créé (27ko) mais il est vide.

    D'ailleurs tu n'es même pas obligé de passer par un fichier, tu pourrais zipper directement sur le flux de la réponse.
    Hmm, je pense que c'est la bonne solution. J'ai compris le principe mais par contre je ne sais pas comment la mettre en place (rookie inside )

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Lenn0x Voir le message
    En rajoutant les Response.AddHeader j'ai le même problème que j'ai eu lors d'un test précédent, à savoir que le ZIP est bien créé (27ko) mais il est vide.
    27ko de vide ? A quoi tu vois qu'il est vide ?

    Citation Envoyé par Lenn0x Voir le message
    Hmm, je pense que c'est la bonne solution. J'ai compris le principe mais par contre je ne sais pas comment la mettre en place (rookie inside )
    Quand tu crées le ZipOutputStream, passe Response.OutputStream au lieu du nom de fichier. Par contre il faut définir les en-têtes avant, parce qu'une fois que tu as commencé à écrire sur le flux de la réponse, c'est trop tard pour envoyer les en-têtes

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par tomlev Voir le message
    27ko de vide ? A quoi tu vois qu'il est vide ?
    Il ne contient rien, tout simplement.

    Citation Envoyé par tomlev Voir le message
    Quand tu crées le ZipOutputStream, passe Response.OutputStream au lieu du nom de fichier. Par contre il faut définir les en-têtes avant, parce qu'une fois que tu as commencé à écrire sur le flux de la réponse, c'est trop tard pour envoyer les en-têtes
    Nickel ça fonctionne ! Maintenant il ne me reste plus qu'à intégrer le CSV.

    Merci beaucoup tomlev!

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Lenn0x Voir le message
    Il ne contient rien, tout simplement.
    Ben c'est DotNetZip qui a foiré alors, parce que "rien", ça devrait pas peser 27ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/08/2013, 02h02
  2. Problème création table avec netbeans
    Par marwen109 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/01/2012, 11h05
  3. Problème création zip avec PHP
    Par julien731 dans le forum Langage
    Réponses: 8
    Dernier message: 27/09/2011, 19h17
  4. Réponses: 6
    Dernier message: 12/06/2006, 17h38

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