Converting blob back to original file type and making it available for download

32,831

use this example and change the SQL database to your Database as well as the Select Statement

SqlConnection pubsConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=pubs;");
SqlCommand logoCMD = new SqlCommand("SELECT pub_id, logo FROM pub_info", pubsConn);

FileStream fs;                          // Writes the BLOB to a file (*.bmp).
BinaryWriter bw;                        // Streams the BLOB to the FileStream object.

int bufferSize = 100;                   // Size of the BLOB buffer.
byte[] outbyte = new byte[bufferSize];  // The BLOB byte[] buffer to be filled by GetBytes.
long retval;                            // The bytes returned from GetBytes.
long startIndex = 0;                    // The starting position in the BLOB output.

string pub_id = "";                     // The publisher id to use in the file name.

// Open the connection and read data into the DataReader.
pubsConn.Open();
SqlDataReader myReader = logoCMD.ExecuteReader(CommandBehavior.SequentialAccess);

while (myReader.Read())
{
  // Get the publisher id, which must occur before getting the logo.
  pub_id = myReader.GetString(0);  

  // Create a file to hold the output.
  fs = new FileStream("logo" + pub_id + ".bmp", FileMode.OpenOrCreate, FileAccess.Write);
  bw = new BinaryWriter(fs);

  // Reset the starting byte for the new BLOB.
  startIndex = 0;

  // Read the bytes into outbyte[] and retain the number of bytes returned.
  retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize);

  // Continue reading and writing while there are bytes beyond the size of the buffer.
  while (retval == bufferSize)
  {
    bw.Write(outbyte);
    bw.Flush();

    // Reposition the start index to the end of the last buffer and fill the buffer.
    startIndex += bufferSize;
    retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize);
  }

  // Write the remaining buffer.
  bw.Write(outbyte, 0, (int)retval - 1);
  bw.Flush();

  // Close the output file.
  bw.Close();
  fs.Close();
}

// Close the reader and the connection.
myReader.Close();
pubsConn.Close();
Share:
32,831
BurninatorDor
Author by

BurninatorDor

Updated on January 20, 2021

Comments

  • BurninatorDor
    BurninatorDor over 3 years

    So I have a client application built using HTML5 and JavaScript. My application invokes a web service (built using c#), which extracts a blob data from a MySql database and passes it on to the client application.

    This blob data is actually a small file (less than 100kb) which was stored in the MySQL Database. I want my client application to be able to convert this blob back to its original file type and then ask the user for download permissions. Now I was wondering if this is a good idea or not? Or should I simply do the file conversion in my Web Service and then send the file itself to the JSP application?

    Any help / suggestions will be highly appreciated! And if you have any good tutorials / codes, which might help me with the conversion then please post them here as an answer? Thanks in advance!

    • MethodMan
      MethodMan over 12 years
      what code do you have thus far...??
    • BurninatorDor
      BurninatorDor over 12 years
      My web service just passes the blob for now...I figured I would start properly once I judge all the options in hand
    • MethodMan
      MethodMan over 12 years
      Are you saying convert a blob back to a blob..? or have you not statetd what it's original file type is..?? just need clarification
    • BurninatorDor
      BurninatorDor over 12 years
      @DJKRAZE sorry if my question does not seem clear enough! Let me give you a small example: So I have a pdf file saved in a MySQL Database as a blob....my web service just extracts the blob from the table and then passes it to the client app. Now I want my client app to receive this blob, convert it back to the pdf file and make it available for download to the user..so my question is: Should I make this conversion on the client side or on the web service? I hope it is a lil clearer now :)
    • MethodMan
      MethodMan over 12 years
      Either way that you do it you would have to do some Streaming I would be a little bit bias in some regards and say client side but what if while streaming you run into errors so Perhaps the webservice or an additional web method could Stream the Blob back as a .pdf.. that's kind of an open ended question it's your call.. I am sure others will chime in soon with their suggestions you would most likely read the info from the database into a byte[] and stream it back to a file
    • MethodMan
      MethodMan over 12 years
      I will post something below but have not tested see if this will help you you will have to change this to fit your example..
    • MethodMan
      MethodMan over 12 years
      this link will probably help you do it the best.. msdn.microsoft.com/en-us/library/87z0hy49(VS.71).aspx
    • BurninatorDor
      BurninatorDor over 12 years
      Ok thanks! I will take a look into it now...
    • Peter Cibula
      Peter Cibula about 7 years
      Perfect !!! Just small bug (if size of file is % (mod) 100 == 0): Replace line: bw.Write(outbyte, 0, (int)retval - 1); To: if (retval > 0) bw.Write(outbyte, 0, (int)retval - 1);
  • MethodMan
    MethodMan over 12 years
    I assume that this worked..? I love it when things come together and work.. glad that I could help
  • bjjrolls
    bjjrolls over 7 years
    hi @MethodMan I'm trying to figure out something similar. Basically I have been able to save certain file types to SQL blob (namely .doc/.docx/pdf/jpeg...' etc) but now need to be able to display them at the click of a button. Will this work the same for my needs? I don't know if I need to specify the file type when trying to open which might be a problem. Thanks