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 :

Proposer le téléchargement d'une piece jointe


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Par défaut Proposer le téléchargement d'une piece jointe
    Bonjour,

    J'ai un GridView qui contient des ImageButton, lors du clique sur un de ces bouton je veux proposer le téléchargement d'un fichier (je ne connais pas le format du fichier).

    Mon fichier est stocké en base dans un champs varbinary(MAX) de cette manière :

    Lors du clic sur le bouton de ma GridView je fais appel à cette méthode :
    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
     
     
        private void ShowTheFile(string FileID)
        {
            ParameterCollection pcFile = new ParameterCollection();
            pcFile.Add("idfile", FileID);
            DataTable tableFichier = BLMWebTools.SelectAppQuery("SELECT * FROM PieceJointeDoc WHERE fileId=@idfile", pcFile);
     
            if (tableFichier.Rows.Count>0)
            {
                Response.Clear();
                Response.ContentType = tableFichier.Rows[0]["contentType"].ToString();
                Response.OutputStream.Write((byte[])tableFichier.Rows[0]["fichier"], 0, Convert.ToInt32(tableFichier.Rows[0]["length"]));
                //Response.BinaryWrite();
                Response.End();
            }
        }
    Ce que j'aimerais c'est que cette méthode me propose le téléchargement du fichier stocké en base quelque soit le type de fichier.

    (Actuellement elle fonctionne très bien mais ne me propose pas de téléchargement et m'affiche directement le fichier, ce qui est assez logique vu mon code)

  2. #2
    Expert confirmé
    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
    Par défaut
    Salut,
    Citation Envoyé par manu f Voir le message
    Actuellement elle fonctionne très bien mais ne me propose pas de téléchargement et m'affiche directement le fichier, ce qui est assez logique vu mon code
    Pas forcement, cela devrait dépendre du type de fichier. La plupart des navigateurs ouvrent les fichiers texte ou PDF dans le navigateur directement.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  3. #3
    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
    Par défaut
    Essaie d'ajouter ce header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Response.AppendHeader("Content-Disposition", "attachment; filename=nomdufichier");

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

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

    Je suis intéressé par ce topic car j'ai posté également quelque chose sur le même sujet.

    Ce que je voudrais savoir, c'est à quoi correspond le "BLMWebTools" de la ligne

    DataTable tableFichier = BLMWebTools.SelectAppQuery("SELECT * FROM PieceJointeDoc WHERE fileId=@idfile", pcFile);
    Merci.

  5. #5
    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
    Par défaut
    Citation Envoyé par stefsas Voir le message
    Ce que je voudrais savoir, c'est à quoi correspond le "BLMWebTools" de la ligne
    Ben a priori c'est un truc spécifique à son application, donc sans intérêt pour toi... A vue de nez c'est une méthode qui renvoie une DataTable à partir d'une requête SQL

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Par défaut
    Ok d'accord.
    Par contre, est-ce que tu pourrais me confirmer ou pas mes propos sur ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Response.ContentType = tableFichier.Rows[0]["contentType"].ToString();
                Response.OutputStream.Write((byte[])tableFichier.Rows[0]["fichier"], 0, Convert.ToInt32(tableFichier.Rows[0]["length"]));
    -contentType, fichier, length sont bien trois champs de la base de données avec :

    . length : la taille du fichier en kb (FileUpload1.PostedFile.ContentLength)
    . fichier : le chemin complet d'accés au fichier (FileUpload1.PostedFile.FileName)
    . contentType : le type du fichier (?)

    Je ne suis pas certain de ces informations ?
    Merci.

  7. #7
    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
    Par défaut
    je connais pas l'application dont il est question dans le premier post, mais voilà ce que je devine :

    Citation Envoyé par stefsas Voir le message
    . length : la taille du fichier en kb (FileUpload1.PostedFile.ContentLength)
    La taille en octets plutôt... on ne parle jamais en Ko, sauf pour l'affichage
    D'ailleurs, quel rapport avec FileUpload ? il s'agit ici d'envoyer un fichier à l'utilisateur, et non l'inverse, donc FileUpload n'a rien à voir là dedans

    Citation Envoyé par stefsas Voir le message
    . fichier : le chemin complet d'accés au fichier (FileUpload1.PostedFile.FileName)
    Plutôt les données binaires du fichier a priori (un tableau de bytes)

    Citation Envoyé par stefsas Voir le message
    . contentType : le type du fichier (?)
    Le type MIME du fichier, oui (par exemple "text/html", "image/png", etc...)

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Par défaut
    Ok merci pour tes explications.
    En fait, je parlais de fileupload car j'utilise cela pour enregistrer mes fichiers dans ma base.

    Et donc, une autre question : Est-ce que je peux récupérer le type MIME de mon fichier avant de l'enregistrer dans ma base, par l'intermédiaire du FileUpload ?

    Merci.

  9. #9
    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
    Par défaut
    Citation Envoyé par stefsas Voir le message
    Et donc, une autre question : Est-ce que je peux récupérer le type MIME de mon fichier avant de l'enregistrer dans ma base, par l'intermédiaire du FileUpload ?
    Avec la propriété FileUpload.PostedFile.ContentType peut-être ?

  10. #10
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Par défaut
    Bonjour tout le monde,

    Ca me propose bien le téléchargement et donc c'est parfait, par contre j'ai une autre question du même genre.

    Dans ma base de donnée j'ai un fichier qui est enregistré dans un champs de type Text, j'aimerais pouvoir faire exactement la même chose que ci-dessus (c'est à dire proposer ce fichier en téléchargement) le problème c'est que je ne connais ni le contentType ni la taille en octet.

    Malgré que je ne connais pas le contentType pensez vous que ce soit possible de proposer un téléchargement du fichier ?

  11. #11
    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
    Par défaut
    Citation Envoyé par manu f Voir le message
    Dans ma base de donnée j'ai un fichier qui est enregistré dans un champs de type Text, j'aimerais pouvoir faire exactement la même chose que ci-dessus (c'est à dire proposer ce fichier en téléchargement) le problème c'est que je ne connais ni le contentType ni la taille en octet.
    Ben si c'est du texte, tu peux utiliser le type "text/plain" (texte brut). Pour la longueur, ça dépend de l'encodage... Le plus simple est sans doute d'encoder explicitement le texte, en UTF-8 par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] bytes = Encoding.UTF8.GetBytes(text);
    Et là tu as la longueur (bytes.Length)

  12. #12
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Par défaut
    Voilà ce que je viens de trouver qui fonctionne, le soucis c'est que comme je ne connais pas le contentType l'utilisateur va devoir choisir avec quel logiciel l'ouvrir et ça c'est pas top.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                byte[] fileinByte = Encoding.Default.GetBytes(fichier);
                Response.AppendHeader("Content-Disposition", "attachment; filename=" + tableFichier.Rows[0]["LabelFichier"].ToString());
                Response.ContentType = "application/octet-stream";
                Response.OutputStream.Write(fileinByte, 0, fileinByte.Length);
                //Response.BinaryWrite();
                Response.End();
    Ce que j'aurais aimé faire c'est justement récupérer le contentType mais je pense pas que c'est possible :/

    En tout cas si vous avez des infos je suis preneur.

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Par défaut
    Moi, j'y suis arrivé avant l'enregistrement dans la base de données en utilisant le composant FileUpload et la propriété FileUpload1.PostedFile.ContentType que m'a indiqué tomlev.

    Mais si ton fichier est déja enregistrer dans la base, je ne sais pas trop?

  14. #14
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Par défaut
    En fait pour la sauvegarde du fichier en base j'utilise une librairie interne à ma boite qui n'enregistre pas le contentType, ce qui fait que je suis coincé de ce coté :/

  15. #15
    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
    Par défaut
    Citation Envoyé par manu f Voir le message
    je ne connais pas le contentType
    Ben tu disais pas que c'était du texte ?

    Sinon, si tu ne connais pas le ContentType, il n'y a aucun moyen (simple) de le deviner...

  16. #16
    Expert confirmé
    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
    Par défaut
    Salut,
    Citation Envoyé par tomlev Voir le message
    Sinon, si tu ne connais pas le ContentType, il n'y a aucun moyen (simple) de le deviner...
    En effet.

    En son temps cette fonction m'a été très utile.
    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
            /// <summary>
            /// This method retreive all the MIME type from the registry and compare it to the file extension
            /// </summary>
            /// <param name="filepath">The full path to the file</param>
            /// <returns></returns>
            public static string GetMIMEType(string filepath)
            {
                RegistryPermission regPerm = new RegistryPermission(RegistryPermissionAccess.Read, "\\HKEY_CLASSES_ROOT");
                RegistryKey classesRoot = Registry.ClassesRoot;
                FileInfo fi = new FileInfo(filepath);
                String dotExt = fi.Extension.ToLower();
                RegistryKey typeKey = classesRoot.OpenSubKey(@"MIME\Database\Content Type");
                string Keyname = String.Empty;
                foreach (string keyname in typeKey.GetSubKeyNames())
                {
                    if ((String)classesRoot.OpenSubKey(@"MIME\Database\Content Type\" + keyname).GetValue("Extension") == dotExt)
                    {
                        Keyname = keyname;
                        break;
                    }
                }
                return Keyname;
            }
    A tester, mais je crois qu'elle suppose que le content type est enregistré sur le serveur. Au besoin, cela peut être ajouté à la main directement sur le serveur.

    Il peut aussi y avoir des problèmes de sécurité car il faut naviguer dans la base de registre. A tester donc.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  17. #17
    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
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    En son temps cette fonction m'a été très utile.
    Ca suppose de connaitre le nom du fichier... ce n'est pas forcément le cas s'il est stocké en BDD

  18. #18
    Expert confirmé
    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
    Par défaut
    Argh, j'ai peut-être loupé une réponse

    Il suffirait alors de récupérer quelques bits du début du fichier pour lire le nom. Ce bout de vbscript permet de le faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ' -------------
    ' En premier lieu, on recherche la position du terme filename="
    ' Pour ce faire, on calcul le nombre d'octet (LimitBin) du premier élément jusqu'à filename="
    ' On effectue une boucle jusqu'au nombre d'octets correspondant au terme filename="
     
    LimitASCII = "filename=" & chr(34) 
    LimitBin=""
    for Z = 1 to Len(LimitASCII)
       LimitBin = LimitBin & chrB(ASC(Mid(LimitASCII, Z, 1)))
    next
    A adapter?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  19. #19
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Par défaut
    Hello

    Je donne des petites nouvelles, en fait ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    string fichier = *****.Base64Decode(tableFichier.Rows[0]["Fichier"].ToString());
    byte[] fileinByte = Encoding.Default.GetBytes(fichier);
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + tableFichier.Rows[0]["LabelFichier"].ToString());
    Response.ContentType = "application/octet-stream";
    Response.OutputStream.Write(fileinByte, 0, fileinByte.Length);
    //Response.BinaryWrite();
    Response.End();
    Me propose bien le téléchargement du fichier sans que l'utilisateur n'a à sélectionné le logiciel lui même.

    Le problème que je rencontrais, c'est apparemment uniquement lié à un certain type de fichier Excel, là j'ai refais des tests avec des .xls, .pdf etc... et ça fonctionne sans avoir à préciser le contentType.

  20. #20
    Expert confirmé
    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
    Par défaut
    Salut,

    Le fait de spécifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application/octet-stream
    ne précise pas l'application qui va ouvrir le fichier que tu envois. C'est le système du client qui va le reconnaître et sélectionner l'application configurée localement.

    J'ai pas vraiment d'exemple sous le coude pour justifier l'emploi de content-type nommés => Pourquoi n'utilise-t-on pas systématiquement "octet-stream"? Peut-être pour forcer le système du client à utiliser un logiciel différent que celui prévu. Par exemple, tu peux forcer l'ouverture d'une page HTML par Excel (si il y a un tableau HTML dedans) ou Word.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

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

Discussions similaires

  1. [C#] envoyer un mail avec une piece jointe
    Par arnauann dans le forum C#
    Réponses: 5
    Dernier message: 22/08/2007, 10h09
  2. Recuperer une piece jointe dans la boite de reception
    Par elbronziero dans le forum Linux
    Réponses: 4
    Dernier message: 15/07/2007, 18h01
  3. faire une piece jointe?
    Par mbouzouita dans le forum Wildfly/JBoss
    Réponses: 8
    Dernier message: 16/05/2007, 13h36
  4. [Indy] attachement d'une piece jointe ne marche pas
    Par pierrot67 dans le forum Composants VCL
    Réponses: 11
    Dernier message: 08/03/2006, 19h07
  5. [ASP 3] Envoyer un Mail avec une piece jointe générer
    Par soltani.slim dans le forum ASP
    Réponses: 4
    Dernier message: 15/02/2006, 10h16

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