Reading stream twice?

When I have uploaded an image from my website I need to do 2 things:

  1. read the image dimensions
  2. save the image to the database

the first thing I do is reading the image stream into an Image object, like so:

var file = Request.Files["logo"];

Image FullsizeImage = Image.FromStream(file.InputStream);

the next thing I do is to save the “file” object to the database (LINQ to SQL). BUT, when I try to save the image to database, the stream from the file has it’s postion at the end of the stream, and it seems no data is present.

I know I should somwhow reset the stream and put it back into position 0, but how do I do that the most effiecent and correct way ?

Answer

Well, the simplest way is:

file.InputStream.Position = 0;

… assuming the stream supports seeking. However, That may do interesting things to the Image if you’re not careful – because it will have retained a reference to the stream.

You may be best off loading the data into a byte array, and then creating two separate MemoryStream objects from it if you still need to. If you’re using .NET 4, it’s easy to copy one stream to another:

MemoryStream ms = new MemoryStream();
Request.Files["logo"].InputStream.CopyTo(ms);
byte[] data = ms.ToArray();

Leave a Reply

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