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 :

Télécharger fichier dans base de données


Sujet :

ASP.NET

  1. #1
    Membre éclairé Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Par défaut Télécharger fichier dans base de données
    Voila j'ai cherché partout sur le net, je ne trouve que pour l'upload d'un fichier, ca cela marche nikel.
    Pour dl j'ai pu lire tu envoie le liens du fichiers et c'est bon. Hors moi mon fichier est stocké en db, Projet oblige.
    j'avais fait cela pour une application windows.
    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 void restaurer(int fId, int numVersion)
            {
                SqlConnection myConnection = new SqlConnection(connectionString);
                SqlCommand myCommand = myConnection.CreateCommand();
                myConnection.Open();
                try
                {
                    myCommand.CommandText = "SELECT FichierData FROM ModificationFichiers WHERE FichierId = @FichierId AND numVersion=@numVersion;";
                    myCommand.CommandType = CommandType.Text;
     
                    SqlParameter FichierId = new SqlParameter();
                    FichierId.ParameterName = "@FichierId";
                    FichierId.SqlDbType = SqlDbType.Int;
                    FichierId.Value = fId;
     
                    myCommand.Parameters.Add(FichierId);
     
                    SqlParameter FichierVersion = new SqlParameter();
                    FichierVersion.ParameterName = "@numVersion";
                    FichierVersion.SqlDbType = SqlDbType.Int;
                    FichierVersion.Value = numVersion;
     
                    myCommand.Parameters.Add(FichierVersion);
                    Byte[] fileDataBytes = (Byte[])myCommand.ExecuteScalar();
                    String fileData = Encoding.ASCII.GetString(fileDataBytes);
     
                    SqlCommand sqlcom2 = myConnection.CreateCommand();
                    sqlcom2.CommandText = "SELECT FichierNom FROM Fichiers WHERE FichierId=" + fId;
                    SqlDataReader sqldata = sqlcom2.ExecuteReader();
                    while (sqldata.Read())
                    {
                        SaveFileDialog saveFileDialog1 = new SaveFileDialog();
                        saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
                        saveFileDialog1.FilterIndex = 2;
                        saveFileDialog1.FileName = sqldata.GetString(0);
                        saveFileDialog1.InitialDirectory = @"C:/";
                        if (File.Exists(saveFileDialog1.FileName))
                        {
                            File.Delete(saveFileDialog1.FileName);
                        }
                        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                        {
                            FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create);
                            byte[] data = fileDataBytes;
                            fs.Write(data, 0, System.Convert.ToInt32(data.Length));
                            fs.Seek(0, SeekOrigin.Begin);
                            fs.Close();
                        }
                    }
                }
     
                catch (Exception ex)
                {
                    MessageBox.Show("erreur" + ex);
                }
     
                finally
                {
                    myConnection.Close();
                }
    Bien entnedu savefile ne fonctionne pas en asp.net (ou en tout cas pas reussi a le faire fonctionné)

    ma question est donc, avec un fichier en db, comment je peux faire pour que l'utilisateur puisse telecharger un fichier?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Par défaut
    http://www.developpez.net/forums/sho...d.php?t=548123

    Si ça peut t'aider ...
    Et si après lecture il te reste des questions n'hésite pas à me les poser.

    Bon courage.

    Voici la méthode pour lire une fois qu'on a récup le fichier binaire de la DB.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Byte[] fichierUpload = RecupFichierDB();
    // Il faut préciser le mime type.
    Response.ContentType = "Image/jpg";
    // Optionnel selon cas d'utilisation
    Response.AddHeader("content-disposition", "attachment; filename=Hello.jpg");
    // Afficher ton fichier (si c'est une image tu peux aussi la convertir avant de l'afficher
    Response.BinaryWrite(fichierUpload);
    Échouer, c'est avoir la possibilité de recommencer de manière plus intelligente.

    Twitter Blog Mon site

    Mon article sur l'agilité

  3. #3
    Membre éclairé Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Par défaut
    j'ai essayer de remduler un peu le code et j'obtiens l'erreure suivante La référence d'objet n'est pas définie à une instance d'un objet à la ligne suivante f.Write(data,0, data.Length);

    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
        public void restaurer(int fId)
        {
            string directorytest = @"c:\test\";
            SqlConnection myConnection = new SqlConnection(ConnectionString);
            SqlCommand myCommand = myConnection.CreateCommand();
            myConnection.Open();
            myCommand.CommandText = "RestaurerFichier";
            myCommand.CommandType = CommandType.StoredProcedure;
     
            SqlParameter fichiersId = new SqlParameter();
            fichiersId.ParameterName = "@fichiersId";
            fichiersId.SqlDbType = SqlDbType.Int;
            fichiersId.Value = fId;
     
            Console.WriteLine(fId);
     
            SqlParameter données = new SqlParameter();
            données.ParameterName = "@données";
            données.SqlDbType = SqlDbType.VarBinary;
            données.Size = 16000;
            données.Direction= ParameterDirection.Output;
            myCommand.Parameters.Add(données);
            File.Delete(directorytest + "test.txt");
            FileStream f = new FileStream( directorytest+"test.txt" ,FileMode.CreateNew);
            byte[] data =(byte[])données.Value;
     
            f.Write(data,0, data.Length);
     
            f.Close();
     
            myConnection.Close();
    une autre idée?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Vu que ton code n'exécute pas la commande SQL, données.Value est null.

  5. #5
    Membre éclairé Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Par défaut
    3 ieme fois que je tombe dans ce piège merci beaucoup ca marche


    MICI

  6. #6
    Membre éclairé Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Par défaut
    par contre avant de cloturer le poste j'utilisais pour l'application windows, savefiledialogue, il y a la meme chose en asp.net, un style de popup qui demande ou on veutsauver le fichier?

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    C'est la navigateur qui s'occupe de télécharger le fichier et c'est donc lui qui propose (ou pas) une boîte de sauvegarde en fonction du type de fichier, de sa configuration propre etc.

  8. #8
    Membre éclairé Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Par défaut
    je ne comprends pas. j'ai un bouton dans un dataliste qui permet de sauver un fichier avec la méthode suivante

    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
           string directorytest = @"c:\test\";
            SqlConnection myConnection = new SqlConnection(ConnectionString);
            SqlCommand myCommand = myConnection.CreateCommand();
            myConnection.Open();
            myCommand.CommandText = "SELECT données FROM fichiers WHERE fichiersId = @fichiersId;";
            myCommand.CommandType = CommandType.Text;
     
            SqlParameter fichiersId = new SqlParameter();
            fichiersId.ParameterName = "@fichiersId";
            fichiersId.SqlDbType = SqlDbType.Int;
            fichiersId.Value = fId;
            myCommand.Parameters.Add(fichiersId);
     
            Byte[] fileDataBytes = (Byte[]) myCommand.ExecuteScalar();
            String fileData = Encoding.ASCII.GetString(fileDataBytes);
     
            SqlCommand sqlcom2 = myConnection.CreateCommand();
            sqlcom2.CommandText = "SELECT nom FROM fichiers WHERE fichiersId=" + fId;
            SqlDataReader sqldata = sqlcom2.ExecuteReader();
            while (sqldata.Read())
            {
                string namefichier = sqldata.GetString(0);
     
                File.Delete(directorytest + "test.txt");
                FileStream fs = new FileStream(directorytest + "test.txt", FileMode.Create);
                byte[] data = fileDataBytes;
                fs.Write(data, 0, System.Convert.ToInt32(data.Length));            
                fs.Seek(0, SeekOrigin.Begin);
                fs.Close();
    mais j'aimerais bien que directorytest soit choisi par l'user.

    Mais avec ca, il sauve directement dans le repertoir que j'ai indiqué.

    que devrais je changé?

    Merci

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Si ton code est de l'ASP.NET, tu sauvegardes sur le serveur là et non pas sur le poste client.

  10. #10
    Membre éclairé Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Par défaut
    Mon projet, j'aurais du commencer par la, c'est une bibliothèque de documents, je dois sauver le fichier dans la db, et le client doit pouvoir le reprendre et le sauver chez lui la ou il veut.

    Mais je nesais pas comment faire . J'arrive a placer le fichier en db (donc en upload) je sais faire telecharger le fichier a l'endroit c:\dossier\fichier\ mais si l'utilisateur veut le sauver ailleur ca je nesais pas comment faire

  11. #11
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    En ASP.NET, tu ne peux pas gérer où le client va sauvegarder le fichier (je me répète). Le serveur transmet le fichier au navigateur du client et après c'est lui qui gère soit l'affichage directement, soit l'enregistrement (en fonction de sa configuration, du type du fichier etc.).

    Le code que tu montres, inclus dans une page ASP.NET, sauvegarde le fichier sur le SERVEUR (sur le C:\Test\ du serveur). A mon avis, vu que tu fais le développement et les tests sur la même machine, tu dois pas bien t'en rendre compte.

  12. #12
    Membre éclairé Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Par défaut
    oky. mais alors la personne uqi m'a donné le projet ne veux pas de fichier créer sur le serveur. Il veut que tout passe par la base de donnée. (je suis débutant en asp.net).

    si je comprend bien ce que je dois faire c'est créer un fichier temporaire, du fichier que le client a choisis dans le dossier temporaire \projet\dossiertemp\ et faire un lien sur ca pour que le client puisse le sauver?

  13. #13
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Par défaut
    Si tu veux récupérer directement sans mettre dans un fichier temp (sur le serveur) il te faut :

    1- Recup le fichier binaire de la base.
    2- Et utilise le code que je t'ai mis dans mon premier poste ... Et comme Kaidan l'a dit selon le type ... il te propose ou pas le popup (mais dans tout les cas l'utilisateur peut sauvegarder ...), par exemple si c'est une image il risque de l'afficher dans IE (ou Firefox) si c'est un .msg ou un .doc il ouvre une popup ...

    Voila c'est la solution la plus simple que je connaisse (sinon tu peux faire un activx ...).
    Échouer, c'est avoir la possibilité de recommencer de manière plus intelligente.

    Twitter Blog Mon site

    Mon article sur l'agilité

  14. #14
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    La sauvegarde dans un fichier temporaire est une étape superflue. Il suffit d'écrire le fichier directement dans le flux de réponse http.

  15. #15
    Membre éclairé Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Par défaut

    je suis perdu la

  16. #16
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Par défaut
    pourquoi lol ?

    Pour récup le fichier de la base c'est le "Select" classique ...

    Et ensuite une fois que tu as récup ton flux binaire, tu dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Response.WriteBinary(MonFichier);
    Ce qui correspond si je ne m'abuse à la phrase de Kaidan :

    "Il suffit d'écrire le fichier directement dans le flux de réponse http."

    Et pour bien faire les choses tu dois préciser le type de ton fichier et ajouter une en tete (pour le nom du fichier par exemple ...).

    Reprend tout depuis le début et ça ira mieux.
    Échouer, c'est avoir la possibilité de recommencer de manière plus intelligente.

    Twitter Blog Mon site

    Mon article sur l'agilité

  17. #17
    Membre éclairé Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Par défaut
    dernière question concernant ce probleme la j'ai choisi la valeur de 6 (car mon fichier est le 6 ieme dans la db)

    J'ai une dataliste itemselected

    <SelectedItemTemplate>
    <asp:Label ID="Label7" runat="server" Text='<%# Eval("fichiersId") %>'></asp:Label>
    <asp:Label ID="Label8" runat="server" Text='<%# Eval("nom") %>'></asp:Label>
    <asp:Button ID="bSaveFile" runat="server" OnClick="bSaveFile_Click" Text="Save File" />
    </SelectedItemTemplate>

    et j'aimerais recumer la valeur de mon label7 comment je peux faire. j'ai cherché dans datalist1. ... mais rien n'y fait ( pas acces a mon label 7)

    j'ai mis DataKeyField="nom" OnSelectedIndexChanged="DataList1_SelectedIndexChanged"

    et dans OnSelectedIndexChanged j'ai protected void DataList1_SelectedIndexChanged(object sender, EventArgs e)
    {
    DataList1.DataBind();
    }

    Merci d'avance

    j'arrive enfin a avoir ma fenetre dl

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

Discussions similaires

  1. Stockage des fichier Dans base de donnée sql
    Par Meryjean dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 29/08/2010, 12h23
  2. [MySQL] insérer des donnée d'un fichier dans base mysql
    Par monsieur77 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/01/2008, 15h20
  3. Fichiers en base de données ou dans le système de fichiers
    Par elitost dans le forum Optimisations
    Réponses: 4
    Dernier message: 13/11/2007, 10h43
  4. bonjour envoi fichier txt dans base de donnée
    Par suya95 dans le forum Débuter
    Réponses: 5
    Dernier message: 30/05/2006, 09h59
  5. Réponses: 3
    Dernier message: 22/05/2006, 16h02

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