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 :

Générer le téléchargement d'un fichier docx


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut Générer le téléchargement d'un fichier docx
    Bonjour

    Je voudrais générer le téléchargement d'un fichier docx, en modifiant, bien entendu, le response de la page. J'utilise le SDK Open XML V2.

    Le problème est que cela génère une erreur quand je change le response, une erreur de parsing XML
    Error parsing near '<?xml version="1.0"
    . Normal donc, puisqu'il n'arrive pas à renvoyer le docx car il trouve un doc xml... Alors je ne vois pas trop comment faire.

    Je me suis inspiré de cet Article :http://internsp.blogspot.com/2007/10...ocx-files.html

    Voici mon code :
    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
     
    //On instancie un WordProcessingDocument à partir d'un fichier            
     
    this.WordProcessingDocument =WordprocessingDocument.Open("C:\Mondoc.docx", true);
     
    byte[] outputBytes = new byte[this.WordProcessingDocument.MainDocumentPart.GetStream().Length];
     
     
    //On récupère le stream de la partie principale
                    this.WordProcessingDocument.MainDocumentPart.GetStream().Read(outputBytes, 0, outputBytes.Length);
     
     
                    memoryStream = new MemoryStream(outputBytes);
     
    //Changement des headers
                    this.PageForDownload.Response.ClearHeaders();
                    this.PageForDownload.Response.AddHeader("content-disposition", "attachment; filename=test.docx");
                    this.PageForDownload.Response.ClearContent();
                    this.PageForDownload.Response.ContentEncoding = System.Text.Encoding.UTF8;
                    this.PageForDownload.Response.ContentType = "application/vnd.ms-word.document.12";
                    memoryStream.Position = 0;
                    BinaryWriter writer = new BinaryWriter(this.PageForDownload.Response.OutputStream);
                    BinaryReader reader = new BinaryReader(memoryStream);
                    writer.Write(reader.ReadBytes((int)memoryStream.Length));
                    reader.Close();
                    writer.Close();
                    memoryStream.Close();
                    this.PageForDownload.Response.Flush();
                    this.PageForDownload.Response.Close();
    Merci de votre aide.

  2. #2
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut
    J'ai essayé une nouvelle façon de faire, toujours en m'inspirant du lien ci dessus, je récréé un package qui va écrire dans un memorystream, en récupérant toutes les parties de package du package existant.

    Nouvelle erreur :
    Error parsing near 'PK..
    Voici le code :

    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
     
    //J'instancie mon nouveau package
     
    Package package = Package.Open(memoryStream, FileMode.OpenOrCreate, FileAccess.ReadWrite);
     
    //Je récupère toutes les parties de l'existant
     
                    foreach (PackagePart packagePart in this.WordProcessingDocument.Package.GetParts())
                    {
                        package.CreatePart(packagePart.Uri, packagePart.ContentType, packagePart.CompressionOption);                    
                    }
     
    //Je flush le tout
                    package.Flush();
                    package.Close();
     
     
    //Je change les headers
     
                    this.PageForDownload.Response.ClearHeaders();
                    this.PageForDownload.Response.AddHeader("content-disposition", "attachment; filename=test.docx");
                    this.PageForDownload.Response.ClearContent();
                    this.PageForDownload.Response.ContentEncoding = System.Text.Encoding.UTF8;
                    this.PageForDownload.Response.ContentType = "application/vnd.ms-word.document.12";
                    memoryStream.Position = 0;
                    BinaryWriter writer = new BinaryWriter(this.PageForDownload.Response.OutputStream);
                    BinaryReader reader = new BinaryReader(memoryStream);
                    writer.Write(reader.ReadBytes((int)memoryStream.Length));
                    reader.Close();
                    writer.Close();
                    memoryStream.Close();
                    this.PageForDownload.Response.Flush();
                    this.PageForDownload.Response.Close();

  3. #3
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut
    J'ai essayé en rajoutant les relationships, pareil :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    foreach (PackageRelationship relationShip in this.WordProcessingDocument.Package.GetRelationships())
                    {
                        package.CreateRelationship(relationShip.TargetUri, relationShip.TargetMode, relationShip.RelationshipType);
                    }
     
                    foreach (PackagePart packagePart in this.WordProcessingDocument.Package.GetParts())
                    {
                        if (!package.PartExists(packagePart.Uri))
                        {
                            package.CreatePart(packagePart.Uri, packagePart.ContentType, packagePart.CompressionOption);
                        }                   
                    }

  4. #4
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut
    J'ai modifié les relations pour les parties et rajouté les propriétés, toujours cette erreur de parsing : 'near Pk'

    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
     
    Package package = Package.Open(memoryStream, FileMode.Create, FileAccess.ReadWrite);
     
                    package.PackageProperties.Category = this.WordProcessingDocument.PackageProperties.Category;
                    package.PackageProperties.ContentStatus = this.WordProcessingDocument.PackageProperties.ContentStatus;
                    package.PackageProperties.ContentType = this.WordProcessingDocument.PackageProperties.ContentType;
                    package.PackageProperties.Created = this.WordProcessingDocument.PackageProperties.Created;
                    package.PackageProperties.Creator = this.WordProcessingDocument.PackageProperties.Creator;
                    package.PackageProperties.Description = this.WordProcessingDocument.PackageProperties.Description;
                    package.PackageProperties.Identifier = this.WordProcessingDocument.PackageProperties.Identifier;
                    package.PackageProperties.Keywords = this.WordProcessingDocument.PackageProperties.Keywords;
                    package.PackageProperties.Language = this.WordProcessingDocument.PackageProperties.Language;
                    package.PackageProperties.LastModifiedBy = this.WordProcessingDocument.PackageProperties.LastModifiedBy;
                    package.PackageProperties.LastPrinted = this.WordProcessingDocument.PackageProperties.LastPrinted;
                    package.PackageProperties.Modified = this.WordProcessingDocument.PackageProperties.Modified;
                    package.PackageProperties.Revision = this.WordProcessingDocument.PackageProperties.Revision;
                    package.PackageProperties.Subject = this.WordProcessingDocument.PackageProperties.Subject;
                    package.PackageProperties.Title = this.WordProcessingDocument.PackageProperties.Title;
                    package.PackageProperties.Version = this.WordProcessingDocument.PackageProperties.Version;
     
                    //Relationships
                    foreach (PackageRelationship relationShip in this.WordProcessingDocument.Package.GetRelationships())
                    {
                        package.CreateRelationship(relationShip.TargetUri, relationShip.TargetMode, relationShip.RelationshipType);
                    }
     
                    //Parts + leur relationship
                    foreach (PackagePart packagePart in this.WordProcessingDocument.Package.GetParts())
                    {
                        if (!package.PartExists(packagePart.Uri))
                        {
                            package.CreatePart(packagePart.Uri, packagePart.ContentType, packagePart.CompressionOption);
     
                            IEnumerable<PackageRelationship> relationShipList = packagePart.GetRelationships();
     
                            foreach (PackageRelationship relationShip in relationShipList)
                            {
                                //On récupère le part en cours
                                PackagePart newPackagePart = package.GetPart(packagePart.Uri);
     
                                //Et on lui ajoute le relationship
                                newPackagePart.CreateRelationship(relationShip.TargetUri, relationShip.TargetMode, relationShip.RelationshipType);
                            }
                        }                   
                    }
     
     
                    package.Flush();
                    package.Close();

  5. #5
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut
    Bon, c'est débile, mais le bouton qui lance la procédure de download était dans un updatepanel, ce qui n'empêche pas le fait que mon fichier soit corrompu (par exemple, document.xml est vide...).

  6. #6
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut
    Bon j'ai réussi, j'ai abandonné l'idée d'un MemoryStream et je suis passé direct en FileStream. Je créé une copie et je l'utilise. Ensuite, pour le response, c'est simple :
    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
     
    //On va récupérer le fileStream
                    FileStream fileStream = new FileStream(newCompleteFileName, FileMode.OpenOrCreate);
     
                    byte[] byteFileStream = new byte[fileStream.Length];
                    fileStream.Read(byteFileStream, 0, byteFileStream.Length);
                    fileStream.Flush();
                    fileStream.Close();
     
     
                    this.Page.Response.ClearHeaders();
                    this.PageResponse.AddHeader("content-disposition", "attachment; filename=test.docx");
                    this.Page.Response.ClearContent();
                    this.Page.Response.ContentEncoding = System.Text.Encoding.UTF8;
                    this.Page.Response.ContentType = "application/vnd.ms-word.document.12";
                    this.Page.Response.BinaryWrite(byteFileStream);
     
    //Flush et Close..

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

Discussions similaires

  1. [2.x] Téléchargement de fichier DOCX ou ODT
    Par noepk dans le forum Symfony
    Réponses: 1
    Dernier message: 20/08/2014, 16h56
  2. Téléchargement de fichiers docx
    Par Bz dans le forum IE
    Réponses: 1
    Dernier message: 24/08/2010, 16h07
  3. Réponses: 4
    Dernier message: 13/06/2007, 15h27
  4. permettre le téléchargement d'un fichier
    Par vincentweb dans le forum Langage
    Réponses: 1
    Dernier message: 23/02/2006, 23h50
  5. [Configuration] problème pour forcer le téléchargement d'un fichier
    Par All Bran dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 02/01/2006, 16h23

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