using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using Npgsql; using NpgsqlTypes; namespace File_downloader { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (textBox1.Text.Length > 0) { NpgsqlConnection conn = new NpgsqlConnection("-----"); conn.Open(); NpgsqlCommand commande; NpgsqlParameter param; commande = new NpgsqlCommand("SELECT syn_notes.titre, syn_notes.pieces_jointes, syn_fichiers.filename from syn_notes LEFT JOIN syn_fichiers ON syn_notes.pieces_jointes=syn_fichiers.id where syn_notes.id=:id", conn); param = new NpgsqlParameter(":id", DbType.Int32); param.Value = Convert.ToInt32(textBox1.Text); commande.Parameters.Add(param); commande.Prepare(); NpgsqlDataReader lecture = commande.ExecuteReader(); //De par la structure de la base de données, il n'y a qu'un fichier joint par note possible. label1.Text = "Aucun fichier lié"; label2.Text = ""; while (lecture.Read()) { toolTip1.Show(lecture.GetValue(0).ToString(), textBox1); label1.Text = lecture.GetValue(2).ToString(); label2.Text = lecture.GetValue(1).ToString(); button2.Enabled = true; } conn.Close(); } } private void button2_Click(object sender, EventArgs e) { saveFileDialog1.FileName = label1.Text; saveFileDialog1.ShowDialog(); } private void saveFileDialog1_FileOk(object sender, CancelEventArgs e) { int compteur = 0, nombre = 0; FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create, FileAccess.Write); BinaryWriter bw = new BinaryWriter(new BufferedStream(fs)); NpgsqlConnection conn = new NpgsqlConnection("---"); conn.Open(); NpgsqlCommand commande; NpgsqlParameter param; //On récupère le nombre de chunks dans la table correspondant à ce fichier. commande = new NpgsqlCommand("SELECT count(splitid) FROM syn_contenu_fichiers WHERE fichier=:idfichier", conn); param = new NpgsqlParameter(":idfichier", DbType.Int32); param.Value = Convert.ToInt32(label2.Text); commande.Parameters.Add(param); commande.Prepare(); nombre = Convert.ToInt32(commande.ExecuteScalar()); while (compteur < nombre)//on récupère et écrit chunk après chunk ... { progressBar1.Value = (compteur * 100) / nombre; progressBar1.Refresh(); commande = new NpgsqlCommand("select contenu from syn_contenu_fichiers where fichier=" + Convert.ToInt32(label2.Text) + " AND splitid=" + compteur, conn); Byte[] result = (Byte[])commande.ExecuteScalar(); bw.Write(result); compteur++; } progressBar1.Value = 100; progressBar1.Refresh(); MessageBox.Show("Download du fichier terminé avec succès !", "DL OK !", MessageBoxButtons.OK, MessageBoxIcon.Information); bw.Flush(); fs.Close(); bw.Close(); conn.Close(); } } }