2010-11-24 5 views
20

Wenn ich ein Bild von meiner Website hochgeladen haben, brauche ich zwei Dinge zu tun:Stream zweimal lesen?

  1. die Bildmaße lesen
  2. speichern Sie das Bild in die Datenbank

das erste, was ich zu lesen tun ist der Bildstrom in ein Bildobjekt, etwa so:

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

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

das nächste, was ich tue, ist das „Datei“ Objekt in die Datenbank (LINQ to SQL) zu speichern. ABER, wenn ich versuche, das Bild in der Datenbank zu speichern, hat der Strom aus der Datei seine Position am Ende des Streams und es scheint, dass keine Daten vorhanden sind.

Ich weiß, ich sollte den Stream zurücksetzen und wieder auf Position 0 setzen, aber wie mache ich das am effektivsten und effektivsten?

Antwort

32

Nun, der einfachste Weg ist:

file.InputStream.Position = 0; 

... vorausgesetzt, der Strom sucht unterstützt. Allerdings kann das interessante Dinge an der Image tun, wenn Sie nicht vorsichtig sind - weil es einen Verweis auf den Stream behalten hat.

Sie können die Daten am besten in ein Byte-Array laden und dann zwei separate MemoryStream-Objekte daraus erstellen, wenn Sie es noch benötigen. Wenn Sie .NET 4 verwenden, ist es einfach, einen Stream in einen anderen zu kopieren:

+1

meinst du file.InputStream.Position = 0; ? – danielovich

+1

@danielovich: Ja, tat ich - sorry, behoben. –