Had to add an attachment functionality to the project I am currently working on at work.

The snippets below use a simple web service (which I didn’t include) that saves the files uploaded to a database and returns the columns read.

You need at least three columns in the table: ID (PK, int), FILENAME (varchar) and CONTENT (BLOB).

// Attach this method to an upload button.
private void UploadFile(object sender, RoutedEventArgs e)
{
   OpenFileDialog fileDialog = new OpenFileDialog();
   // In case you want filtering.
   fileDialog.DefaultExt = ".txt";
   fileDialog.Filter = "Text documents (.txt)|*.txt";

   bool? result = fileDialog.ShowDialog();

   if (result == true)
   {
       using (FileStream fs = new FileStream(fileDialog.FileName, FileMode.Open, FileAccess.Read))
       {
           Byte[] b = new Byte[fs.Length];
           fs.Read(b, 0, b.Length);
           fs.Close();

           try
           {
               // Save the byte array (b) to the BLOB column in the database.
               // I am using a web service.
               WebService.SaveAttachment(Path.GetFileName(fileDialog.FileName), b);
               MessageBox.Show("File uploaded!");
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.ToString());
           }
       }
   }
}

// Attach this method to a button (or DataGridRow or whatever) to open the file.
// I am passing in a file ID and I fetch the attachment information from the database.
private void OpenFile(int fileid)
{
   var att = WebService.GetAttachment(fileid);
   var tempfile = Path.Combine(Path.GetTempPath(), att.Filename);

   if (File.Exists(tempfile))
   {
       File.Delete(tempfile);
   }

   FileStream create = File.OpenWrite(tempfile);
   create.Write(att.Bytes, 0, att.Bytes.Length);
   create.Close();

   // Opens the file as a new process, not blocking the GUI.
   Task.Factory.StartNew(new Action(delegate()
   {
       Process p = Process.Start(tempfile);

       while (p != null && !p.HasExited)
       {
           Thread.Sleep(100);
       }

       File.Delete(tempfile);
   }));
}

// Attach this method to a download button.
// Again, passing in a file ID.
private void DownloadFile(int fileid)
{
   var att = WebService.GetAttachment(fileid);

   var saveFileDialog = new SaveFileDialog();
   saveFileDialog.FileName = att.Filename;
   bool? result = saveFileDialog.ShowDialog();

   if (result == true)
   {
       var filename = saveFileDialog.FileName;
       using (var fileStream = new FileStream(filename, FileMode.Create, FileAccess.Write))
       {
           // att.Bytes is the BLOB column from the database.
           fileStream.Write(att.Bytes, 0, att.Bytes.Length);
           MessageBox.Show("File downloaded!");
       }
   }
}

Reference:
http://support.microsoft.com/en-nz/kb/317016

Leave a Reply

Your email address will not be published. Required fields are marked *