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 :

Ouverture fichier à partir d'un lien dans un gridview


Sujet :

ASP.NET

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    526
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Points : 224
    Points
    224
    Par défaut Ouverture fichier à partir d'un lien dans un gridview
    Bonjour,

    J'ai un gridview contenant une colonne de lien se référent à des noms de fichiers (fichiers stockés en base de données).

    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
    <GridViewEmp:EmptyGridView ID="GridViewListeFichier" runat="server" OnRowDataBound="GridView1_RowDataBound" AllowPaging="False" ShowHeader="true" 
               AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="Chemin" 
               DataSourceID="SqlDataSourceFichier" BorderColor="#94979A"  CellPadding="10" BackColor="#ECEBEF"  HeaderStyle-BackColor="#6A97D0" AlternatingRowStyle-BackColor="#D2DBE6" HeaderStyle-ForeColor="White">    
     
            <Columns>
                <asp:TemplateField ShowHeader="true">
                    <ItemTemplate>
                        <asp:CheckBox ID="chkBox" runat="server" />
                    </ItemTemplate>
                    <HeaderTemplate>
                        <asp:CheckBox ID="cbSelectAll" runat="server" Text="" />
                    </HeaderTemplate>
                 </asp:TemplateField>
     
                 <asp:HyperLinkField datatextfield="Chemin" 
                datatextformatstring="{0:c}" datanavigateurlfields="Chemin" headertext="Nom fichier" target="_self" SortExpression="Chemin"/>
           </Columns>
     
         </GridViewEmp:EmptyGridView>
    Ce que je voudrais savoir, c'est comment faire pour ouvrir un fichier par simple clic sur son lien correspondant ?

    Merci.

  2. #2
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    Les moyens sont nombreux pour envoyer un fichier au client. Plein d'exemples dans le forum. Il faut retenir le principe: Récupérer le fichier sous la forme d'un tableau de bits et l'envoyer dans la réponse.

    Les moyens de faire ça sont nombreux (webform, httphandler).

    A+

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    526
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Points : 224
    Points
    224
    Par défaut
    Bonjour,

    Je rebondis d'un autre topic pour revenir sur le mien.
    J'ai repris et adapté de cet autre topic une fonction qui permet de charger chez le client un fichier en fonction d'un numéro id :

    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
    protected void ShowTheFile(string FileID)
        {
            ParameterCollection pcFile = new ParameterCollection();
            pcFile.Add("idfile", FileID);
     
    		DataTable tableFichier = new DataTable();
            using (SqlConnection cnDataBase = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString()))
            {
                cnDataBase.Open();
                SqlCommand cmTable = new SqlCommand("select * from TableImage where NumFichier=@idfile", cnDataBase);
                SqlDataAdapter daTable = new SqlDataAdapter(cmTable);
                daTable.Fill(tableFichier);
            }  
     
     
            if (tableFichier.Rows.Count>0)
            {
                Response.Clear();
                Response.ContentType = tableFichier.Rows[0]["ContentType"].ToString();
                Response.OutputStream.Write((byte[])tableFichier.Rows[0]["Image"], 0, Convert.ToInt32(tableFichier.Rows[0]["Taille"]));
     
    			//Response.AppendHeader("Content-Disposition", "attachment; filename=FileUpload1.FileName");
                //Response.BinaryWrite();
                Response.End();
            }
        }
    Par contre, je ne vois pas comment l'accrocher à mon gridview de sorte que lorsque je clique un lien de mon tableau, cela m'ouvre mon fichier ?

    Est-ce que quelqu'un verrait comment faire ? Merci.

  4. #4
    Membre régulier Avatar de hamouda64
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 63
    Points : 74
    Points
    74
    Par défaut
    Je t'invite à voir cet exemple, peut être que tu peux t'inspirer de lui

    http://dotnet.developpez.com/faq/asp...dcurrentwindow

    Bon courage

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    526
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Points : 224
    Points
    224
    Par défaut
    En fait, mon code fait déja à peu près la même chose.
    Le truc que je ne vois pas, c'est comment attacher ma fonction à mon gridview de sorte qu'a chaque lien, j'ai le bon fichier qui s'ouvre.

  6. #6
    Expert confirmé
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Points : 4 066
    Points
    4 066
    Par défaut
    Bonjour,

    Comme te l'as conseillé Immobilis, tu peux utiliser un HttpHandler.

    A défaut, vu que tu veux rester sur ta fonction. Tu créés une page DownloadFile.Aspx. Pour chaque élément de ta GridView, tu places un lien du type /url/DownloadFile.Aspx?Id=tonIDduFichier.

    Dans le Page_Load de ta file, tu récupère l'Id et appelle ta fonction.

    C'est pas non plus la meilleure solution, mais ça te permettra de faire ce que tu souhaites.

    En espérant t'avoir aidé.

  7. #7
    Membre régulier Avatar de hamouda64
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 63
    Points : 74
    Points
    74
    Par défaut
    C'est une bonne solution et c'est ce qui je t’ai proposé dans l’exemple, c'est de récupérer l'id du fichier et rediriger l’utilisateur vers une autre page avec l'id comme paramètre dans l'url et par la suite, récupéré le fichier et le régénère afin de pouvoir le télécharger

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    526
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Points : 224
    Points
    224
    Par défaut
    Ok d'accord.

    Par contre, pour récupérer le paramètre dans l'url, j'ai voulu utiliser ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string parametreURLfichier = Request.Params("NumFichier");
    tiré d' ici

    mais j'ai un message d'erreur de la part de VS me disant :

    Un membre 'System.Web.HttpRequest.Params' ne pouvant pas être appelé ne peut pas être utiisé comme une méthode
    Est-ce quelqu'un connait ce problème ? Merci.

  9. #9
    Membre régulier Avatar de hamouda64
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 63
    Points : 74
    Points
    74
    Par défaut
    Pour récupérer la valeur du paramètre de l'url c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Request.QueryString["NumFichier"]

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    526
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Points : 224
    Points
    224
    Par défaut
    Ok merci, avec cela c'est bon.

    J'aurais une autre question: Pour l'instant, mon fichier s'ouvre directement dans mon navigateur.
    Qu'est qu'il faut que je rajoute pour que celui-ci s'ouvre dans une autre fenêtre ?

    Merci.

  11. #11
    Membre régulier Avatar de hamouda64
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 63
    Points : 74
    Points
    74
    Par défaut
    tu met dans :
    et ca doit marché

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    526
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Points : 224
    Points
    224
    Par défaut
    Oui c'est ça.

    Encore une dernière question :
    Je viens de tester le téléchargement de plusieurs fichiers et lorsque je veux charger un fichier .docx (word 2007), cela m'affiche un message d'erreur

    La page XML ne peut pas être affichée
    Impossible d'afficher l'entrée XML en utilisant la feuille de style . Corrigez l'erreur, puis cliquez sur le bouton Actualiser ou réessayez ultérieurement.


    --------------------------------------------------------------------------------

    Un caractère incorrect a été trouvé dans un contenu de texte. Erreur de traitement de la ressource http://localhost:49573/D...

    PK
    Tu sais d'où cela peut venir ? Merci.

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    526
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Points : 224
    Points
    224
    Par défaut
    En fait, je viens de tester sur les .doc et cela marche.
    C'est au niveau des nouveaux format d'office, par exemple le type mime de word 2007: application/vnd.openxmlformats-officedocument.word.

    Est-ce que quelqu'un saurait comment corriger le problème ?

    Merci.

  14. #14
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    Si le type MIME n'est pas correctement reconnu, tu peux utiliser le flux d'octets.

    A+

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    526
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Points : 224
    Points
    224
    Par défaut
    Ok, mais dis moi si je me trompe:
    Dans mon cas, si j'enregistre mon fichier en base à l'aide d'un FileUpload, le flux d'octet est bien récupérer par FileUpload1.FileBytes ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     command.CommandText = "INSERT INTO TableImage(Image,Chemin,Taille,DateCreation,ContentType) values (@file_bytes,@Chemin,@Taille,@DateCreation,@ContentType)";
                                    command.Parameters.Add("file_bytes", SqlDbType.VarBinary).Value = FileUpload1.FileBytes;
                                   command.Parameters.Add("Chemin", SqlDbType.VarChar, 200).Value = FileUpload1.FileName;
                                    command.Parameters.Add("Taille", SqlDbType.VarChar, 50).Value = FileUpload1.PostedFile.ContentLength;
                                    command.Parameters.Add("DateCreation", SqlDbType.Date).Value = DateTime.Now;
                                    command.Parameters.Add("ContentType", SqlDbType.VarChar, 50).Value = FileUpload1.PostedFile.ContentType;
     
                                    command.ExecuteNonQuery();
    Par contre, je ne vois pas ce qu'il faut rajouté à mon code pour lire ce flux d'octet (ce n'est pas déja le cas ?) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Response.Clear();
                    Response.ContentEncoding = System.Text.Encoding.UTF8;
                    Response.ContentType = tableFichier.Rows[0]["ContentType"].ToString();
                                  Response.OutputStream.Write((byte[])tableFichier.Rows[0]["Image"], 0, Convert.ToInt32(tableFichier.Rows[0]["Taille"]));
                    Response.End();
    Merci.

  16. #16
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par stefsas Voir le message
    Je viens de tester le téléchargement de plusieurs fichiers et lorsque je veux charger un fichier .docx (word 2007), cela m'affiche un message d'erreur
    Mmmh. Peut-être me trompe-je. Sachant que les fichiers Office 2007 sont une archive contenant un fichier XML, il est peut-être possible qu'il y ait eu une erreur à l'encodage des bits constituant le fichier. Est-ce que tu fais des tests sur l'encodage?

    A+

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

Discussions similaires

  1. VBA ouverture fichier à partir de variables
    Par jc1408 dans le forum Général VBA
    Réponses: 1
    Dernier message: 28/09/2007, 19h37
  2. Réponses: 2
    Dernier message: 28/07/2006, 12h42
  3. Ouvrir un fichier à partir d'un lien
    Par dessinateurttuyen dans le forum Langage
    Réponses: 14
    Dernier message: 25/07/2006, 10h43
  4. Réponses: 8
    Dernier message: 21/06/2006, 19h14

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