2010-11-24 3 views
20

Quand je l'ai téléchargé une image de mon site web que je dois faire 2 choses:Lecture du flux deux fois?

  1. lire les dimensions de l'image
  2. enregistrer l'image dans la base de données

la première chose que je fais est la lecture le flux d'image dans un objet image, comme ceci:

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

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

la prochaine chose que je fais est de sauver l'objet « fichier » à la base de données (LINQ to SQL). MAIS, quand j'essaie de sauvegarder l'image dans la base de données, le flux du fichier a sa position à la fin du flux, et il semble qu'aucune donnée n'est présente.

Je sais que je devrais réinitialiser le flux et le remettre en position 0, mais comment le faire de la manière la plus efficace et la plus correcte?

Répondre

32

Eh bien, la façon la plus simple est:

file.InputStream.Position = 0; 

... en supposant que le flux prend en charge la recherche. Cependant, cela peut faire des choses intéressantes au Image si vous n'êtes pas prudent - car il aura conservé une référence au flux.

Il est peut-être préférable de charger les données dans un tableau d'octets, puis de créer deux objets MemoryStream séparés si vous en avez encore besoin. Si vous utilisez .NET 4, il est facile de copier un flux dans un autre:

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

voulez-vous dire file.InputStream.Position = 0; ? – danielovich

+1

@danielovich: Oui, je l'ai fait - désolé, corrigé. –