2010-09-14 5 views
13

_data является байтом [] массивом данных вложения.Вложение электронной почты из MemoryStream пуста

Когда я делаю это:

var ms = new MemoryStream(_data.Length); 
ms.Write(_data,0,_data.Length); 
mailMessage.Attachments.Add(new Attachment(ms, attachment.Name)); 

Приложение поставляется пустым. На самом деле Outlook показывает размер файла, но он неверен.

Ну, я думал, что в моей _data есть проблема. Затем я решил попробовать такой подход:

var ms = new MemoryStream(_data.Length); 
ms.Write(_data,0,_data.Length); 
fs = new FileStream(@"c:\Temp\"+attachment.Name,FileMode.CreateNew); 
fs.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length); 
fs.Flush(); 
fs.Close(); 
mailMessage.Attachments.Add(new Attachment(@"c:\Temp\" + attachment.Name)); 

И что работает. Что случилось с первым?

ответ

34

С первой формы, вы не «перематывать» поток:

ms.Position = 0; 

Так он пытался читать из конца потока, где не было каких-либо данных ,

Более простой способ создания MemoryStream является просто использовать конструктор, хотя:

var ms = new MemoryStream(_data); 
mailMessage.Attachments.Add(new Attachment(ms, attachment.Name)); 
+0

Это не помогает, я пробовал это – Agzam

+0

@Ike: Пожалуйста, покажите код, в котором вы это пробовали. –

+2

oh .. wait ... На самом деле это было ... Я уверен, что раньше я это пробовал, и это не сработало. вероятно, я перепутал с чем-то еще ... – Agzam

4

Не используйте GetBuffer. Используйте ms.ToArray().

+0

проблемы в первой части не второй – Agzam

+1

@Ike: Aliostad указывал на то, что ваш второй фрагмент еще не очень право - это, вероятно, будет иметь проблемы. –