Поток как приложение к System.Net.Mail составляет 0 байтов - PullRequest
17 голосов
/ 23 августа 2009

У меня есть проект, в котором я использую генератор PDF для отправки файла пользователю. Мы хотели бы дать пользователю возможность прикрепить этот файл к электронному письму, и у нас возникли проблемы при совместном использовании объекта Stream и логики вложений.

Мы начнем с ABCpdf, который имеет два метода сохранения: он может сохранить в поток или, если вы дадите ему строку, он попытается сохранить в файл на диске. Мы сделали оба без проблем.

Stream stream = new MemoryStream();
myPdf.Save(stream);

На данный момент все в основном круто - stream имеет несколько килобайт данных, и если вы сохраните () в файл, вы получите реальный файл с тем же числом байтов.

Таким образом, мы прикрепляем письмо к этому моменту (после инициализации почтового объекта, установив To: и From: и т. Д.):

mail.Attachments.Add(new Attachment(stream, "myPdf.pdf"));
mail.Send();

... что позволяет нам получить электронное письмо с 0 байтами, но с правильным именем файла.

Все примеры, которые я нахожу в Интернете, используют StreamReader или StreamWriter или Flush () или что-то в этом роде. Всегда кажется, что это сложнее, чем просто пропустить поток, но может быть, только одна или две строки сложнее. Ни один из этих примеров не начинается с Stream - они всегда пытаются превратить массив в Stream, чтобы показать вам, насколько это просто, или захватить файл с диска (что мы не можем сделать, поэтому мы взволнованы использовать поток).

В любом случае, если кто-нибудь сможет объяснить, что я делаю неправильно или что мне следует делать, я был бы очень признателен. Спасибо.

Ответы [ 2 ]

37 голосов
/ 23 августа 2009

Догадываюсь ... Обратный поток данных до начала перед отправкой нит

// Set the position to the beginning of the stream.
stream.Seek(0, SeekOrigin.Begin);
mail.Attachments.Add(new Attachment(stream, "myPdf.pdf"));
mail.Send();
0 голосов
/ 23 августа 2009

Вы пытались сохранить файл и затем прикрепить его вместо попытки присоединить поток?

добавлены

Обычный процесс здесь будет

  1. Использование потока для создания файла на диске

  2. Прикрепить файл к электронному письму

  3. Удалить файл, когда закончите с ним.

...